1.深度學習框架
pytorch與其他框架的比較
pytorch的學習方法:
課程安排:
PyTorch是一個基於Python的科學計算庫,它有以下特點:
- 類似於NumPy,但是它可以使用GPU
- 可以用它定義深度學習模型,可以靈活地進行深度學習模型的訓練和使用
2.tensor的運算
Tensor類似與NumPy的ndarray,唯一的區別是Tensor可以在GPU上加速運算。
(1)加法
x = torch.rand(5,3) y = torch.rand(5,3) z=x+y print(x) print(y) print(z)
效果圖:
(2)Torch Tensor和NumPy array會共享內存,所以改變其中一項也會改變另一項。
把Torch Tensor轉變成NumPy Array
# Torch Tensor和NumPy array會共享內存,所以改變其中一項也會改變另一項。 # 把Torch Tensor轉變成NumPy Array a = torch.ones(5) b = a.numpy() print(a) print(b) b[1] = 2 print(a)
效果圖:
(3)在Torch Tensor和NumPy array之間相互轉化非常容易。
# 把NumPy ndarray轉成Torch Tensor a = np.ones(5) b = torch.from_numpy(a) np.add(a, 1, out=a) print(a) print(b)
效果圖:
3.利用Pytorch的nn庫來構建神經網絡
這次我們使用PyTorch中nn這個庫來構建網絡。 用PyTorch autograd來構建計算圖和計算gradients, 然后PyTorch會幫我們自動計算gradient。
import torch.nn as nn import torch N, D_in, H, D_out = 64, 1000, 100, 10 # 隨機創建一些訓練數據 x = torch.randn(N, D_in) y = torch.randn(N, D_out) model = torch.nn.Sequential( torch.nn.Linear(D_in, H, bias=False), # w_1 * x + b_1 torch.nn.ReLU(), torch.nn.Linear(H, D_out, bias=False), ) torch.nn.init.normal_(model[0].weight) torch.nn.init.normal_(model[2].weight) # model = model.cuda() loss_fn = nn.MSELoss(reduction='sum') learning_rate = 1e-6 for it in range(500): # Forward pass y_pred = model(x) # model.forward() # compute loss loss = loss_fn(y_pred, y) # computation graph print(it, loss.item()) # Backward pass loss.backward() # update weights of w1 and w2 with torch.no_grad(): for param in model.parameters(): # param (tensor, grad) param -= learning_rate * param.grad model.zero_grad()
效果圖:
4.自定義nn modules
我們可以定義一個模型,這個模型繼承自nn.Module類。如果需要定義一個比Sequential模型更加復雜的模型,就需要定義nn.Module模型。
import torch.nn as nn import torch N, D_in, H, D_out = 64, 1000, 100, 10 # 隨機創建一些訓練數據 x = torch.randn(N, D_in) y = torch.randn(N, D_out) # 自定義模型,定義一個類繼承torch.nn.Module class TwoLayerNet(torch.nn.Module): def __init__(self, D_in, H, D_out): super(TwoLayerNet, self).__init__() # define the model architecture self.linear1 = torch.nn.Linear(D_in, H, bias=False) self.linear2 = torch.nn.Linear(H, D_out, bias=False) def forward(self, x): y_pred = self.linear2(self.linear1(x).clamp(min=0)) return y_pred model = TwoLayerNet(D_in, H, D_out) # 定義損失函數 loss_fn = nn.MSELoss(reduction='sum') learning_rate = 1e-4 optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate) for it in range(500): # Forward pass y_pred = model(x) # model.forward() # compute loss loss = loss_fn(y_pred, y) # computation graph print(it, loss.item()) optimizer.zero_grad() # Backward pass loss.backward() # update model parameters optimizer.step()