深度學習3-pytorch學習
Tensor 定義與 PyTorch 操作
1. Tensor 定義:
Tensor 是 PyTorch 中的數據結構,類似于 NumPy 數組。可以通過不同方式創建 tensor 對象:
import torch# 定義一個 1D Tensor
x1 = torch.Tensor([3, 4])# 定義一個 Float 類型的 Tensor
x2 = torch.FloatTensor([4, 4])# 使用正態分布隨機生成 Tensor
x3 = torch.randn(3, 4)
print(x1)
print(x2)
print(x3)
2. PyTorch 與 NumPy 之間的轉換:
可以使用 torch.from_numpy()
和 .numpy()
方法在 PyTorch Tensor 和 NumPy 數組之間進行轉換:
import numpy as np# 創建一個 NumPy 數組
numpy_tensor = np.random.randn(10, 20)# 將 NumPy 數組轉換為 PyTorch Tensor
pytorch_tensor = torch.from_numpy(numpy_tensor)# 將 PyTorch Tensor 轉換為 NumPy 數組
new_numpy_tensor = pytorch_tensor.numpy()
3. GPU 和 CPU 之間的轉換:
PyTorch 支持在 GPU 上進行計算,可以通過 .cuda()
方法將 Tensor 轉移到 GPU,使用 .cpu()
將其轉回 CPU:
x = torch.randn(3, 4)# 轉移到 GPU(GPU 0)
x_gpu = x.cuda(0)# 轉移到 GPU(GPU 1)
x_gpu = x.cuda(1)# 轉回 CPU
x_cpu = x_gpu.cpu()# 轉換為 NumPy 數組
x_array = x_gpu.cpu().numpy()
4. Tensor 的形狀和維度:
可以使用 .shape
或 .size()
查看 Tensor 的維度和形狀,unsqueeze
和 squeeze
方法分別用于增加和減少維度:
x = torch.randn(4, 3)# 查看形狀
print(x.shape)# 增加一個維度
x_unsqueezed = x.unsqueeze(1)
print(x_unsqueezed.shape) # 形狀變為 [4, 1, 3]# 減少一個維度
x_squeezed = x_unsqueezed.squeeze()
print(x_squeezed.shape) # 形狀變回 [4, 3]
5. Tensor 的高級操作:
- 求最大值和索引:
max_index, max_value = torch.max(x, dim=1) # 獲取每行的最大值和索引
print(max_index)
print(max_value)
- 求和:
sum_tensor = torch.sum(x, dim=1, keepdim=True) # 求每行的和
print(sum_tensor)
6. 求梯度:
Tensor 的 requires_grad_()
方法使得 Tensor 可以追蹤梯度,允許進行反向傳播(自動求導):
x = torch.tensor(3.0, requires_grad=True)
y = x**2# 求導
y.backward()# 打印梯度
print(x.grad) # 輸出:tensor(6.)
注意: 求得的梯度會累積,如果不清零會對后續計算產生影響。
python復制編輯x.grad = torch.tensor(0.0) # 清空梯度
y2 = x**2
y2.backward()
print(x.grad) # 輸出:tensor(6.)
7. 創建不同類型的 Tensor:
# 創建全為 1 的 Tensor
tensor1 = torch.ones((10, 4))
print(tensor1)# 創建全為 0 的 Tensor
tensor2 = torch.zeros((10, 4))
print(tensor2)# 創建正態分布隨機值的 Tensor
tensor3 = torch.normal(0, 0.1, (4, 10, 4))
print(tensor3)
8. Variable:
為了構建神經網絡,PyTorch 引入了 Variable
類,主要用于對 Tensor 進行自動求導操作。Variable
包含了三個重要屬性:
.data
:用于訪問 Tensor。.grad
:用于訪問梯度(導數)。.grad_fn
:描述如何計算這個 Variable。
from torch.autograd import Variable# 創建 Variable
x = Variable(torch.ones(2, 2), requires_grad=True)
y = Variable(torch.ones(2, 2), requires_grad=True)
z = torch.sum(x + y)# 查看數據
print(z.data)# 反向傳播
z.backward()# 打印梯度
print(x.grad)
9. 動態圖/靜態圖
PyTorch 采用動態圖(Dynamic Computation Graph)的方式,每次計算時都會重新構建計算圖,這樣便于調試,而 TensorFlow 則使用靜態圖(Static Computation Graph),在定義計算圖之后執行。這使得 PyTorch 更適合快速開發和調試。
- Tensor 是 PyTorch 中最基本的數據結構,類似于 NumPy 數組,但可以在 GPU 上進行加速計算。
- PyTorch 提供了豐富的 Tensor 操作,如求最大值、求和、改變形狀、求梯度等。
Variable
是 Tensor 的高級封裝,它使得 PyTorch 在進行梯度計算時更加靈活。- 動態計算圖使得 PyTorch 在調試和開發時非常方便,但相較于 TensorFlow 的靜態圖,可能會稍慢。