<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【深度學(xué)習(xí)】翻譯:60分鐘入門PyTorch(三)——神經(jīng)網(wǎng)絡(luò)

          共 5240字,需瀏覽 11分鐘

           ·

          2021-02-02 20:48

          前言

          原文翻譯自: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?F


          class?Net(nn.Module):

          ????def?__init__(self):
          ????????super(Net,?self).__init__()
          ????????#?1?input?image?channel,?6?output?channels,?3x3?square?convolution
          ????????#?kernel
          ????????self.conv1?=?nn.Conv2d(1,?6,?3)
          ????????self.conv2?=?nn.Conv2d(6,?16,?3)
          ????????#?an?affine?operation:?y?=?Wx?+?b
          ????????self.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)?window
          ????????x?=?F.max_pool2d(F.relu(self.conv1(x)),?(2,?2))
          ????????#?If?the?size?is?a?square?you?can?only?specify?a?single?number
          ????????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?x

          ????def?num_flat_features(self,?x):
          ????????size?=?x.size()[1:]??#?all?dimensions?except?the?batch?dimension
          ????????num_features?=?1
          ????????for?s?in?size:
          ????????????num_features?*=?s
          ????????return?num_features


          net?=?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)造一個隨機(jī)的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=)

          將所有參數(shù)的梯度緩存清零,然后進(jìn)行隨機(jī)梯度的的反向傳播.

          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上運(yùn)行,導(dǎo)出,加載等
          • nn.Parameter-一種張量,當(dāng)把它賦值給一個Module時,被自動的注冊為參數(shù).
          • autograd.Function-實現(xiàn)一個自動求導(dǎo)操作的前向和反向定義, 每個張量操作都會創(chuàng)建至少一個Function節(jié)點(diǎn),該節(jié)點(diǎn)連接到創(chuàng)建張量并對其歷史進(jìn)行編碼的函數(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ò)的輸出和目標(biāo)值相差多少。

          在nn包中有幾種不同的損失函數(shù).一個簡單的損失函數(shù)是:nn.MSELoss,它計算輸入和目標(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=)

          現(xiàn)在,你反向跟蹤loss,使用它的.grad_fn屬性,你會看到向下面這樣的一個計算圖: input -> conv2d -> relu -> maxpool2d -> conv2d -> relu -> maxpool2d -> view -> linear -> relu -> linear -> relu -> linear -> MSELoss -> loss

          所以, 當(dāng)你調(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



          反向傳播

          為了反向傳播誤差,我們所需做的是調(diào)用loss.backward().你需要清除已存在的梯度,否則梯度將被累加到已存在的梯度。

          現(xiàn)在,我們將調(diào)用loss.backward(),并查看conv1層的偏置項在反向傳播前后的梯度。

          net.zero_grad()?????#?zeroes?the?gradient?buffers?of?all?parameters

          print('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ī)則是隨機(jī)梯度下降(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)

          然而,當(dāng)你使用神經(jīng)網(wǎng)絡(luò)是,你想要使用各種不同的更新規(guī)則,比如SGD,Nesterov-SGD,Adam, RMSPROP等.為了能做到這一點(diǎn),我們構(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è)置為零。這是因為梯度是反向傳播部分中的說明那樣是累積的。




          往期精彩回顧





          本站知識星球“黃博的機(jī)器學(xué)習(xí)圈子”(92416895)

          本站qq群704220115。

          加入微信群請掃碼:

          瀏覽 67
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  99精品成人免费毛片无码 | 爱液视频网站 | 先锋影音av在线 亚州在线无码视频 | 农村一级婬片A片AAA毛片古装 | 色婷婷亚洲一 |