深度学习第二章
2.1:数据操作
1、创建行向量:
张量:表示一个由数值组成的数组
创建一个含n个元素的行向量:
x = torch.arrange(n)
x
2、访问张量形状
x.shape
3、获取张量元素总数
x.numel()
4、改变张量形状
X = x.reshape(3, 4)
X
可以通过-1来自动计算出形状:
X = x.reshape(-1, 4)
X
X = x.reshape(3, -1)
X
5、创建只包含特定元素的张量
(1)创建全为0的张量:
torch.zeros((2, 3, 4))
创建了一个两层三行四列的全为0的张量
(2)创建全为1的张量:
torch.ones((2, 3, 4))
6、获取特定的形状的服从高斯分布的随机元素张量(均值为0,标准差为1)
标准差(Standard Deviation, 简称SD)是一种用于量化数据集中每个值相对于平均值(均值)的分散程度的统计指标。它反映了数据的离散程度,即数据点与均值的偏离程度。标准差越小,表示数据点越接近均值;标准差越大,表示数据点分布得越广。
torch.randn(3, 4)
7、为所需张量每个值进行赋值:
tensor:张量
torch.tensor([[2, 1, 3, 4], [1, 2, 3, 4], [4, 3, 2, 1]])
8、运算符:
求e的x次方:
x = torch.tensor([1, 2, 3, 4])
tensor.exp(x)
9、连接两个张量:
torch.cat((X, Y), dim=0)
按0轴(行)连接两个张量。
10、对张量中所有元素求和
X.sum()
11、广播机制
进行广播的前提:
-
维度大小一致或其中一个维度为 1:
- 对于每一个维度,两个张量的维度大小必须相等,或者其中一个维度的大小为 1。
-
从末尾维度开始比较:
- 广播是从末尾的维度开始逐一比较的。也就是说,两个张量的末尾维度(最后一个维度)必须相等或其中一个为 1,然后逐步向前比较。
两个张量的形状不一致不能够进行运算会进行广播,多数情况下我们会对数组中长度为1的轴进行广播:
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2),reshape((1, 2))
a, b
a + b
矩阵将a复制列,矩阵b将复制行,然后元素相加
12、索引和切片
索引:
X[-1]
切片:
X[1, 3]
取区间[1 ,3)左闭右开
可以根据指定索引将数据写入张量
X[1, 2] = 9
修改多行元素:
X[0:2, :] = 12
X
修改多列元素:
X[:, 0:2]
X
13、节省内存
通常我们在对一个张量进行运算过后,新的张量会存储在新的内存中:
before = id(y) // 获取y的内存地址
Y = Y + X
id(Y) == before
这是不可取的:
(1)我们不想总是不必要的分配内存,我们希望原地执行这些更新
(2)如果不原地更新,其他引用依然会指向就得内存位置,这样我们的某些代码会引用旧的数据
也可以使用X += Y,不能使用X = X + Y
14、转换为其他python对象
A = X.numpy()
B = torch.tensor(A)
type(A), type(B)
将大小为1的张量转换为python标量:
a = torch.tensor([3.5])
a, a.item(), float(a), int(a)
2.2:数据预处理:
1、处理缺失值:
pd.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None)
data
:要转换的数据,可以是 Pandas 的 Series、DataFrame 或者包含 Series 的字典。prefix
:哑变量列名的前缀,可以是字符串或字符串列表。prefix_sep
:前缀与原始列名之间的分隔符,默认是'_'
。dummy_na
:是否为 NaN 值创建哑变量列,默认为False
,即不创建。columns
:要进行转换的列名列表。如果指定了columns
,只有这些列会被转换成哑变量。sparse
:是否返回稀疏矩阵,默认为False
。drop_first
:是否删除每个变量的第一个水平(category),以避免多重共线性,默认为False
。dtype
:指定生成的哑变量的数据类型。
实例:
import pandas as pd# 创建一个包含分类变量的 DataFrame
df = pd.DataFrame({'A': ['type1', 'type2', 'type3', 'type1', 'type2']})
print("原始数据:\n", df)# 将分类变量转换为哑变量
dummy_df = pd.get_dummies(df['A'])
print("\n转换后的哑变量数据:\n", dummy_df)
输出:
原始数据:A
0 type1
1 type2
2 type3
3 type1
4 type2转换后的哑变量数据:type1 type2 type3
0 1 0 0
1 0 1 0
2 0 0 1
3 1 0 0
4 0 1 0
在这个示例中,pd.get_dummies()
将列 'A'
中的分类变量转换为哑变量。每个分类变量的每个水平(category)都会被转换成一个新的二进制列。
示例 2:使用前缀和前缀分隔符
import pandas as pd# 创建一个包含分类变量的 DataFrame
df = pd.DataFrame({'A': ['type1', 'type2', 'type3', 'type1', 'type2']})# 使用前缀和前缀分隔符
dummy_df = pd.get_dummies(df['A'], prefix='category', prefix_sep='-')
print(dummy_df)
输出:
category-type1 category-type2 category-type3
0 1 0 0
1 0 1 0
2 0 0 1
3 1 0 0
4 0 1 0
在这个示例中,使用了前缀 'category'
和前缀分隔符 '-'
,生成了带有前缀的哑变量列。
2、转换为张量格式
X, y = torch.tensor(inputs.value), torch.tensor(output.values)
X, y