张量基本运算
说明
- 张量运算包括算术、线性代数、矩阵操作(转置、索引、切片)、采样等。
- 这些操作中的每一个都可以在 GPU 上运行(速度通常比在 CPU 上更高)。
- 如果使用 Colab,转到运行时 > 更改运行时类型 > GPU 来分配 GPU。
- 默认情况下,张量是在 CPU 上创建的。我们需要使用.to方法明确地将张量移动到 GPU (在检查 GPU 可用性之后)。
- 但是跨设备复制大张量在时间和内存方面可能很昂贵!
# 如果GPU可用
if torch.cuda.is_available():
tensor = tensor.to('cuda')
切片和索引
tensor = torch.ones(4, 4)
print('First row: ', tensor[0])
print('First column: ', tensor[:, 0])
print('Last column:', tensor[..., -1])
tensor[:,1] = 0
print(tensor)
连接张量
# 可以使用torch.cat用来连接沿给定维度的一系列张量
t1 = torch.cat([tensor, tensor, tensor], dim=1)
print(t1)
算数运算
两张量的矩阵运算
y1 = tensor @ tensor.T
y2 = tensor.matmul(tensor.T)
y3 = torch.rand_like(tensor)
torch.matmul(tensor, tensor.T, out=y3)
元素间相乘
z1 = tensor * tensor
z2 = tensor.mul(tensor)
z3 = torch.rand_like(tensor)
torch.mul(tensor, tensor, out=z3)
单元素张量
# 如果您有一个单元素张量,例如通过将张量的所有值聚合为一个值,您可以使用以下# 方法将其转换为 Python 数值item():
agg = tensor.sum()
agg_item = agg.item()
print(agg_item, type(agg_item))
就地操作
# 将结果存储到操作数中的操作称为就地操作。它们由_后缀表示。
print(tensor, "\n")
tensor.add_(5)
print(tensor)
说明
- 就地操作节省了一些内存,但在计算导数时可能会出现问题,因为会立即丢失历史记录。因此,不鼓励使用它们。
使用Numpy桥接
- CPU 和 NumPy 数组上的张量可以共享它们的底层内存位置,改变一个将改变另一个。
张量到Numpy数组
t = torch.ones(5)
print(f"t: {t}")
n = t.numpy()
print(f"n: {n}")
张量的变化反应到Numpy数组中
t.add_(1)
print(f"t: {t}")
print(f"n: {n}")
Numpy数组到张量
n = np.ones(5)
t = torch.from_numpy(n)
NumPy 数组中的变化反映在张量中
np.add(n, 1, out=n)
print(f"t: {t}")
print(f"n: {n}")