张量基本运算

张量基本运算

说明

  • 张量运算包括算术、线性代数、矩阵操作(转置、索引、切片)、采样等。
  • 这些操作中的每一个都可以在 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}")
posted @ 2021-09-27 16:11  mx_info  阅读(1041)  评论(0编辑  收藏  举报