神經網絡可以使用?torch.nn
?包構建.
autograd
?實現了反向傳播功能, 但是直接用來寫深度學習的代碼在很多情況下還是稍顯復雜,torch.nn
?是專門為神經網絡設計的模塊化接口.?nn
?構建于?Autograd
?之上, 可用來定義和運行神經網絡.?nn.Module
?是?nn
?中最重要的類, 可把它看成是一個網絡的封裝, 包含網絡各層定義以及?forward
?方法, 調用?forward(input)
?方法, 可返回前向傳播的結果.
一個典型的神經網絡訓練過程如下:
讓我們來定義一個網絡:
- 定義具有一些可學習參數(或權重)的神經網絡
- 迭代輸入數據集
- 通過網絡處理輸入
- 計算損失(輸出的預測值與實際值之間的距離)
- 將梯度傳播回網絡
- 更新網絡的權重, 通常使用一個簡單的更新規則:?
weight?=?weight?-?learning_rate?*?gradient
import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as Fclass Net(nn.Module):def __init__(self):super(Net, self).__init__()# 卷積層 '1'表示輸入圖片為單通道, '6'表示輸出通道數, '5'表示卷積核為5*5# 核心self.conv1 = nn.Conv2d(1, 6, 5)self.conv2 = nn.Conv2d(6, 16, 5)# 仿射層/全連接層: y = Wx + bself.fc1 = nn.Linear(16 * 5 * 5, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)def forward(self, x):#在由多個輸入平面組成的輸入信號上應用2D最大池化.# (2, 2) 代表的是池化操作的步幅x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))# 如果大小是正方形, 則只能指定一個數字x = F.max_pool2d(F.relu(self.conv2(x)), 2)x = x.view(-1, self.num_flat_features(x))x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return xdef num_flat_features(self, x):size = x.size()[1:] # 除批量維度外的所有維度num_features = 1for s in size:num_features *= sreturn num_featuresnet = Net()
print(net)
?