数据操作
1.ndarray
1.1深度学习框架比Numpy的ndarray多一些重要功能:
- GPU很好地支持加速计算,而NumPy仅支持CPU计算
- 张量类支持自动微分。 这些功能使得张量类更适合深度学习
1.2 广播机制
这种机制的工作方式如下:
- 通过适当复制元素来扩展一个或两个数组,以便在转换之后,两个张量具有相同的形状;
- 对生成的数组执行按元素操作。
示例
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a, b
结果
(tensor([[0],
[1],
[2]]),
tensor([[0, 1]]))
示例
a + b
tensor([[[ 0, 2],
[ 4, 6]],
[[ 4, 6],
[ 8, 10]],
[[ 8, 10],
[12, 14]]])
1.2.1 不同形状的张量计算:
- 标量和任意形状的张量:标量可以和任意形状的张量进行计算,计算过程就是标量和张量的每一个元素进行计算。
![image]()
- 相同维度、不同形状的张量之间计算
![image]()
![image]()
t21的形状是(1, 4),和t2的形状(3, 4)在第一个分量上取值不同,但该分量上t21取值为1,因此可以广播,也就可以进行计算
![image]()
![image]()
此时,t24的形状是(3, 1),而t25的形状是(1, 3),二者的形状在两个份量上均不相同,但都有存在1的情况,因此也是可以广播的 - 三维张量的广播
两个张量的形状上有两个分量不同时,只要不同的分量仍然有一个取值为1,则仍然可以广播
![image]()
![image]()
4.不同维度的张量计算过程中广播
对于不同维度的张量,我们首先可以将低维的张量升维,然后依据相同维度不同形状的张量广播规则进行广播。而低维向量的升维也非常简单,只需将更高维度方向的形状填充为1即可,例如:
![image]()
1.3 节省内存
例如,如果我们用Y = X + Y,我们将取消引用Y指向的张量,而是指向新分配的内存处的张量。这可能是不可取的,原因有两个:
- 首先,我们不想总是不必要地分配内存。在机器学习中,我们可能有数百兆的参数,并且在一秒内多次更新所有参数。通常情况下,我们希望原地执行这些更新;
- 如果我们不原地更新,其他引用仍然会指向旧的内存位置,这样我们的某些代码可能会无意中引用旧的参数。
我们可以使用切片表示法将操作的结果分配给先前分配的数组,例如:
示例1
Z = torch.zeros_like(Y)
print('id(Z):', id(Z))
Z[:] = X + Y
print('id(Z):', id(Z)
结果1
id(Z): 4538296976
id(Z): 4538296976
示例2
before = id(X)
X += Y
id(X) == before
结果2
True
extra note:
1.
import os
os.makedirs(os.path.join('..', 'data'), exist_ok=True) # 创建文件夹
data_file = os.path.join('..', 'data', 'house_tiny.csv') # 拼接成一个新的文件路
- 在Pandas中,get_dummies()是一个用于创建虚拟变量(dummy variable)的函数。虚拟变量是一种将分类变量转换为数值变量的方法,它将一个有限的类别变量拆分为多个二元变量(0或1),以便更好地表示数据:
示例
print(inputs)
NumRooms Alley
0 3.0 Pave
1 2.0 NaN
2 4.0 NaN
3 3.0 NaN
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs
NumRooms Alley_Pave Alley_nan
0 3.0 1 0
1 2.0 0 1
2 4.0 0 1
3 3.0 0 1









浙公网安备 33010602011771号