張量基本運算
說明
- 張量運算包括算術、線性代數、矩陣操作(轉置、索引、切片)、采樣等。
- 這些操作中的每一個都可以在 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}")