日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人工智能 > pytorch >内容正文

pytorch

【深度学习】翻译:60分钟入门PyTorch(三)——神经网络

發(fā)布時(shí)間:2025/3/12 pytorch 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【深度学习】翻译:60分钟入门PyTorch(三)——神经网络 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

原文翻譯自:Deep Learning with PyTorch: A 60 Minute Blitz

翻譯:林不清(https://www.zhihu.com/people/lu-guo-92-42-88)

目錄

60分鐘入門(mén)PyTorch(一)——Tensors

60分鐘入門(mén)PyTorch(二)——Autograd自動(dòng)求導(dǎo)

60分鐘入門(mén)Pytorch(三)——神經(jīng)網(wǎng)絡(luò)

60分鐘入門(mén)PyTorch(四)——訓(xùn)練一個(gè)分類(lèi)器

神經(jīng)網(wǎng)絡(luò)

可以使用torch.nn包來(lái)構(gòu)建神經(jīng)網(wǎng)絡(luò). 你已知道autograd包,nn包依賴(lài)autograd包來(lái)定義模型并求導(dǎo).一個(gè)nn.Module包含各個(gè)層和一個(gè)forward(input)方法,該方法返回output.

例如,我們來(lái)看一下下面這個(gè)分類(lèi)數(shù)字圖像的網(wǎng)絡(luò).

neural

他是一個(gè)簡(jiǎn)單的前饋神經(jīng)網(wǎng)絡(luò),它接受一個(gè)輸入,然后一層接著一層的輸入,直到最后得到結(jié)果。

神經(jīng)網(wǎng)絡(luò)的典型訓(xùn)練過(guò)程如下:

  • 定義神經(jīng)網(wǎng)絡(luò)模型,它有一些可學(xué)習(xí)的參數(shù)(或者權(quán)重);

  • 在數(shù)據(jù)集上迭代;

  • 通過(guò)神經(jīng)網(wǎng)絡(luò)處理輸入;

  • 計(jì)算損失(輸出結(jié)果和正確值的差距大小)

  • 將梯度反向傳播會(huì)網(wǎng)絡(luò)的參數(shù);

  • 更新網(wǎng)絡(luò)的參數(shù),主要使用如下簡(jiǎn)單的更新原則:weight = weight - learning_rate * gradient

定義網(wǎng)絡(luò)

我們先定義一個(gè)網(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ù)(計(jì)算梯度)在使用autograd時(shí)自動(dòng)為你創(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)造一個(gè)隨機(jī)的3232的輸入,注意:這個(gè)網(wǎng)絡(luò)(LeNet)期望的輸入大小是3232.如果使用MNIST數(shù)據(jù)集來(lái)訓(xùn)練這個(gè)網(wǎng)絡(luò),請(qǐng)把圖片大小重新調(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ù)的梯度緩存清零,然后進(jìn)行隨機(jī)梯度的的反向傳播.

net.zero_grad() out.backward(torch.randn(1,?10))

注意

``torch.nn``只支持小批量輸入,整個(gè)torch.nn包都只支持小批量樣本,而不支持單個(gè)樣本 例如,``nn.Conv2d``將接受一個(gè)4維的張量,每一維分別是(樣本數(shù)*通道數(shù)*高*寬). 如果你有單個(gè)樣本,只需使用`input.unsqueeze(0)`來(lái)添加其它的維數(shù). 在繼續(xù)之前,我們回顧一下到目前為止見(jiàn)過(guò)的所有類(lèi).

回顧

  • torch.Tensor-支持自動(dòng)編程操作(如backward())的多維數(shù)組。同時(shí)保持梯度的張量。

  • nn.Module-神經(jīng)網(wǎng)絡(luò)模塊.封裝參數(shù),移動(dòng)到GPU上運(yùn)行,導(dǎo)出,加載等

  • nn.Parameter-一種張量,當(dāng)把它賦值給一個(gè)Module時(shí),被自動(dòng)的注冊(cè)為參數(shù).

  • autograd.Function-實(shí)現(xiàn)一個(gè)自動(dòng)求導(dǎo)操作的前向和反向定義, 每個(gè)張量操作都會(huì)創(chuàng)建至少一個(gè)Function節(jié)點(diǎn),該節(jié)點(diǎn)連接到創(chuàng)建張量并對(duì)其歷史進(jìn)行編碼的函數(shù)。

現(xiàn)在,我們包含了如下內(nèi)容:

  • 定義一個(gè)神經(jīng)網(wǎng)絡(luò)

  • 處理輸入和調(diào)用backward

剩下的內(nèi)容:

  • 計(jì)算損失值

  • 更新神經(jīng)網(wǎng)絡(luò)的權(quán)值

損失函數(shù)

一個(gè)損失函數(shù)接受一對(duì)(output, target)作為輸入(output為網(wǎng)絡(luò)的輸出,target為實(shí)際值),計(jì)算一個(gè)值來(lái)估計(jì)網(wǎng)絡(luò)的輸出和目標(biāo)值相差多少。

在nn包中有幾種不同的損失函數(shù).一個(gè)簡(jiǎn)單的損失函數(shù)是:nn.MSELoss,它計(jì)算輸入和目標(biāo)之間的均方誤差。

例如:

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屬性,你會(huì)看到向下面這樣的一個(gè)計(jì)算圖: input -> conv2d -> relu -> maxpool2d -> conv2d -> relu -> maxpool2d -> view -> linear -> relu -> linear -> relu -> linear -> MSELoss -> loss

所以, 當(dāng)你調(diào)用loss.backward(),整個(gè)圖被區(qū)分為損失以及圖中所有具有requires_grad = True的張量,并且其.grad 張量的梯度累積。

為了說(shuō)明,我們反向跟蹤幾步:

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層的偏置項(xiàng)在反向傳播前后的梯度。

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ò)包包含了各種用來(lái)構(gòu)成深度神經(jīng)網(wǎng)絡(luò)構(gòu)建塊的模塊和損失函數(shù),一份完整的文檔查看這里

唯一剩下的內(nèi)容:

  • 更新網(wǎng)絡(luò)的權(quán)重

更新權(quán)重

實(shí)踐中最簡(jiǎn)單的更新規(guī)則是隨機(jī)梯度下降(SGD).

weight=weight?learning_rate?gradient

我們可以使用簡(jiǎn)單的Python代碼實(shí)現(xiàn)這個(gè)規(guī)則。

learning_rate?=?0.01 for?f?in?net.parameters():f.data.sub_(f.grad.data?*?learning_rate)

然而,當(dāng)你使用神經(jīng)網(wǎng)絡(luò)是,你想要使用各種不同的更新規(guī)則,比如SGD,Nesterov-SGD,Adam, RMSPROP等.為了能做到這一點(diǎn),我們構(gòu)建了一個(gè)包torch.optim實(shí)現(xiàn)了所有的這些規(guī)則.使用他們非常簡(jiǎn)單:

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()手動(dòng)將梯度緩沖區(qū)設(shè)置為零。這是因?yàn)樘荻仁欠聪騻鞑ゲ糠种械恼f(shuō)明那樣是累積的。

往期精彩回顧適合初學(xué)者入門(mén)人工智能的路線及資料下載機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機(jī)器學(xué)習(xí)在線手冊(cè)深度學(xué)習(xí)筆記專(zhuān)輯《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專(zhuān)輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專(zhuān)輯 本站知識(shí)星球“黃博的機(jī)器學(xué)習(xí)圈子”(92416895) 本站qq群704220115。 加入微信群請(qǐng)掃碼:

總結(jié)

以上是生活随笔為你收集整理的【深度学习】翻译:60分钟入门PyTorch(三)——神经网络的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。