【深度学习】翻译:60分钟入门PyTorch(三)——神经网络
前言
原文翻譯自:Deep Learning with PyTorch: A 60 Minute Blitz
翻譯:林不清(https://www.zhihu.com/people/lu-guo-92-42-88)
目錄
60分鐘入門PyTorch(一)——Tensors
60分鐘入門PyTorch(二)——Autograd自動求導(dǎo)
60分鐘入門Pytorch(三)——神經(jīng)網(wǎng)絡(luò)
60分鐘入門PyTorch(四)——訓(xùn)練一個分類器
神經(jīng)網(wǎng)絡(luò)
可以使用torch.nn包來構(gòu)建神經(jīng)網(wǎng)絡(luò). 你已知道autograd包,nn包依賴autograd包來定義模型并求導(dǎo).一個nn.Module包含各個層和一個forward(input)方法,該方法返回output.
例如,我們來看一下下面這個分類數(shù)字圖像的網(wǎng)絡(luò).
neural他是一個簡單的前饋神經(jīng)網(wǎng)絡(luò),它接受一個輸入,然后一層接著一層的輸入,直到最后得到結(jié)果。
神經(jīng)網(wǎng)絡(luò)的典型訓(xùn)練過程如下:
- 定義神經(jīng)網(wǎng)絡(luò)模型,它有一些可學(xué)習(xí)的參數(shù)(或者權(quán)重); 
- 在數(shù)據(jù)集上迭代; 
- 通過神經(jīng)網(wǎng)絡(luò)處理輸入; 
- 計算損失(輸出結(jié)果和正確值的差距大小) 
- 將梯度反向傳播會網(wǎng)絡(luò)的參數(shù); 
- 更新網(wǎng)絡(luò)的參數(shù),主要使用如下簡單的更新原則:weight = weight - learning_rate * gradient 
定義網(wǎng)絡(luò)
我們先定義一個網(wǎng)絡(luò):
import?torch import?torch.nn?as?nn import?torch.nn.functional?as?Fclass?Net(nn.Module):def?__init__(self):super(Net,?self).__init__()#?1?input?image?channel,?6?output?channels,?3x3?square?convolution#?kernelself.conv1?=?nn.Conv2d(1,?6,?3)self.conv2?=?nn.Conv2d(6,?16,?3)#?an?affine?operation:?y?=?Wx?+?bself.fc1?=?nn.Linear(16?*?6?*?6,?120)??#?6*6?from?image?dimension?self.fc2?=?nn.Linear(120,?84)self.fc3?=?nn.Linear(84,?10)def?forward(self,?x):#?Max?pooling?over?a?(2,?2)?windowx?=?F.max_pool2d(F.relu(self.conv1(x)),?(2,?2))#?If?the?size?is?a?square?you?can?only?specify?a?single?numberx?=?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:]??#?all?dimensions?except?the?batch?dimensionnum_features?=?1for?s?in?size:num_features?*=?sreturn?num_featuresnet?=?Net() print(net) Net((conv1): Conv2d(1, 6, kernel_size=(3, 3), stride=(1, 1))(conv2): Conv2d(6, 16, kernel_size=(3, 3), stride=(1, 1))(fc1): Linear(in_features=576, out_features=120, bias=True)(fc2): Linear(in_features=120, out_features=84, bias=True)(fc3): Linear(in_features=84, out_features=10, bias=True) )你只需定義forward函數(shù),backward函數(shù)(計算梯度)在使用autograd時自動為你創(chuàng)建.你可以在forward函數(shù)中使用Tensor的任何操作。
net.parameters()返回模型需要學(xué)習(xí)的參數(shù)。
params?=?list(net.parameters()) print(len(params)) print(params[0].size())??#?conv1's?.weight 10 torch.Size([6, 1, 3, 3])構(gòu)造一個隨機的3232的輸入,注意:這個網(wǎng)絡(luò)(LeNet)期望的輸入大小是3232.如果使用MNIST數(shù)據(jù)集來訓(xùn)練這個網(wǎng)絡(luò),請把圖片大小重新調(diào)整到32*32.
input?=?torch.randn(1,?1,?32,?32) out?=?net(input) print(out) tensor([[-0.0765, 0.0522, 0.0820, 0.0109, 0.0004, 0.0184, 0.1024, 0.0509,0.0917, -0.0164]], grad_fn=<AddmmBackward>)將所有參數(shù)的梯度緩存清零,然后進行隨機梯度的的反向傳播.
net.zero_grad() out.backward(torch.randn(1,?10))注意
``torch.nn``只支持小批量輸入,整個torch.nn包都只支持小批量樣本,而不支持單個樣本 例如,``nn.Conv2d``將接受一個4維的張量,每一維分別是(樣本數(shù)*通道數(shù)*高*寬). 如果你有單個樣本,只需使用`input.unsqueeze(0)`來添加其它的維數(shù). 在繼續(xù)之前,我們回顧一下到目前為止見過的所有類.
回顧
- torch.Tensor-支持自動編程操作(如backward())的多維數(shù)組。同時保持梯度的張量。 
- nn.Module-神經(jīng)網(wǎng)絡(luò)模塊.封裝參數(shù),移動到GPU上運行,導(dǎo)出,加載等 
- nn.Parameter-一種張量,當把它賦值給一個Module時,被自動的注冊為參數(shù). 
- autograd.Function-實現(xiàn)一個自動求導(dǎo)操作的前向和反向定義, 每個張量操作都會創(chuàng)建至少一個Function節(jié)點,該節(jié)點連接到創(chuàng)建張量并對其歷史進行編碼的函數(shù)。 
現(xiàn)在,我們包含了如下內(nèi)容:
- 定義一個神經(jīng)網(wǎng)絡(luò) 
- 處理輸入和調(diào)用backward 
剩下的內(nèi)容:
- 計算損失值 
- 更新神經(jīng)網(wǎng)絡(luò)的權(quán)值 
損失函數(shù)
一個損失函數(shù)接受一對(output, target)作為輸入(output為網(wǎng)絡(luò)的輸出,target為實際值),計算一個值來估計網(wǎng)絡(luò)的輸出和目標值相差多少。
在nn包中有幾種不同的損失函數(shù).一個簡單的損失函數(shù)是:nn.MSELoss,它計算輸入和目標之間的均方誤差。
例如:
output?=?net(input) target?=?torch.randn(10)??#?a?dummy?target,?for?example target?=?target.view(1,?-1)??#?make?it?the?same?shape?as?output criterion?=?nn.MSELoss()loss?=?criterion(output,?target) print(loss) tensor(1.5801, grad_fn=<MseLossBackward>)現(xiàn)在,你反向跟蹤loss,使用它的.grad_fn屬性,你會看到向下面這樣的一個計算圖: input -> conv2d -> relu -> maxpool2d -> conv2d -> relu -> maxpool2d -> view -> linear -> relu -> linear -> relu -> linear -> MSELoss -> loss
所以, 當你調(diào)用loss.backward(),整個圖被區(qū)分為損失以及圖中所有具有requires_grad = True的張量,并且其.grad 張量的梯度累積。
為了說明,我們反向跟蹤幾步:
print(loss.grad_fn)??#?MSELoss print(loss.grad_fn.next_functions[0][0])??#?Linear print(loss.grad_fn.next_functions[0][0].next_functions[0][0])??#?ReLU <MseLossBackward object at 0x0000023193A40E08> <AddmmBackward object at 0x0000023193A40E48> <AccumulateGrad object at 0x0000023193A40E08>反向傳播
為了反向傳播誤差,我們所需做的是調(diào)用loss.backward().你需要清除已存在的梯度,否則梯度將被累加到已存在的梯度。
現(xiàn)在,我們將調(diào)用loss.backward(),并查看conv1層的偏置項在反向傳播前后的梯度。
net.zero_grad()?????#?zeroes?the?gradient?buffers?of?all?parametersprint('conv1.bias.grad?before?backward') print(net.conv1.bias.grad)loss.backward()print('conv1.bias.grad?after?backward') print(net.conv1.bias.grad) conv1.bias.grad before backward tensor([0., 0., 0., 0., 0., 0.]) conv1.bias.grad after backward tensor([ 0.0013, 0.0068, 0.0096, 0.0039, -0.0105, -0.0016])現(xiàn)在,我們知道了該如何使用損失函數(shù)
稍后閱讀:
神經(jīng)網(wǎng)絡(luò)包包含了各種用來構(gòu)成深度神經(jīng)網(wǎng)絡(luò)構(gòu)建塊的模塊和損失函數(shù),一份完整的文檔查看這里
唯一剩下的內(nèi)容:
- 更新網(wǎng)絡(luò)的權(quán)重 
更新權(quán)重
實踐中最簡單的更新規(guī)則是隨機梯度下降(SGD).
weight=weight?learning_rate?gradient
我們可以使用簡單的Python代碼實現(xiàn)這個規(guī)則。
learning_rate?=?0.01 for?f?in?net.parameters():f.data.sub_(f.grad.data?*?learning_rate)然而,當你使用神經(jīng)網(wǎng)絡(luò)是,你想要使用各種不同的更新規(guī)則,比如SGD,Nesterov-SGD,Adam, RMSPROP等.為了能做到這一點,我們構(gòu)建了一個包torch.optim實現(xiàn)了所有的這些規(guī)則.使用他們非常簡單:
import?torch.optim?as?optim#?create?your?optimizer optimizer?=?optim.SGD(net.parameters(),?lr=0.01)#?in?your?training?loop: optimizer.zero_grad()???#?zero?the?gradient?buffers output?=?net(input) loss?=?criterion(output,?target) loss.backward() optimizer.step()????#?Does?the?update注意
觀察如何使用optimizer.zero_grad()手動將梯度緩沖區(qū)設(shè)置為零。這是因為梯度是反向傳播部分中的說明那樣是累積的。
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機器學(xué)習(xí)在線手冊深度學(xué)習(xí)筆記專輯《統(tǒng)計學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯 本站知識星球“黃博的機器學(xué)習(xí)圈子”(92416895) 本站qq群704220115。 加入微信群請掃碼:總結(jié)
以上是生活随笔為你收集整理的【深度学习】翻译:60分钟入门PyTorch(三)——神经网络的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: win7如何设置还原点
- 下一篇: 【深度学习】李沐《动手学深度学习》的Py
