如何在PyTorch中定義一個簡單的卷積神經網路?


要定義一個簡單的卷積神經網路 (CNN),我們可以按照以下步驟進行:

步驟

  • 首先,我們匯入重要的庫和包。我們將嘗試在PyTorch中實現一個簡單的CNN。在以下所有示例中,所需的Python庫是**torch**。請確保您已安裝它。

import torch
import torch.nn as nn
import torch.nn.functional as F
  • 我們的下一步是構建一個簡單的CNN模型。在這裡,我們使用nn包來實現我們的模型。為此,我們定義一個類**MyNet**並將**nn.Module**作為引數傳遞。

class MyNet(nn.Module):
  • 我們需要在類中建立兩個函式來準備我們的模型。第一個是**init()**,第二個是**forward()**。在**init()**函式中,我們呼叫**super()**函式並定義不同的層。我們必須新增一些卷積層才能將其分類為CNN。

  • 我們需要例項化上面定義的類來訓練資料集上的模型。當我們例項化類時,會執行**forward()**函式。

model = MyNet()
  • 列印**model**以檢視不同的層。

print(model)

示例1

在下面的程式中,我們實現了一個簡單的卷積神經網路。我們添加了不同的層,例如卷積層、最大池化層和全連線(線性)層。

import torch
import torch.nn as nn
import torch.nn.functional as F

class MyNet(nn.Module):
   def __init__(self):
      super().__init__()
      self.conv1 = nn.Conv2d(3, 6, 5)
      self.pool = nn.MaxPool2d(2, 2)
      self.conv2 = nn.Conv2d(6, 16, 5)
      self.fc1 = nn.Linear(16 * 5 * 5, 120)
      self.fc2 = nn.Linear(120, 84)
      self.fc3 = nn.Linear(84, 10)

   def forward(self, x):
      x = self.pool(F.relu(self.conv1(x)))
      x = self.pool(F.relu(self.conv2(x)))
      x = torch.flatten(x, 1) # flatten all dimensions except batch
      x = F.relu(self.fc1(x))
      x = F.relu(self.fc2(x))
      x = self.fc3(x)
      return x
net = MyNet()
print(net)

輸出

Net(
   (conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))
   (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
   (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))
   (fc1): Linear(in_features=400, 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)
)

示例2

在下面的程式中,我們實現了一個簡單的卷積神經網路。我們添加了不同的層,例如卷積層、最大池化層和全連線(線性)層。

import torch
import torch.nn as nn
import torch.nn.functional as F
class Model(nn.Module):
   def __init__(self):
      super(Model, self).__init__()

      # define the layers
      self.conv1 = nn.Conv2d(3, 16, 3, padding=1)
      self.conv2 = nn.Conv2d(16, 32, 3, padding=1)
      self.conv3 = nn.Conv2d(32, 64, 3, padding=1)
      self.pool = nn.MaxPool2d(2, 2)
      self.linear1 = nn.Linear(64*4*4, 512)
      self.linear2 = nn.Linear(512, 10)

   def forward(self, x):
      x = self.pool(F.relu(self.conv1(x)))
      x = self.pool(F.relu(self.conv2(x)))
      x = self.pool(F.relu(self.conv3(x)))
      x = x.view(-1, 1024) ## reshaping
      x = F.relu(self.linear1(x))
      x = self.linear2(x)
      return x

model = Model()
print(model)

輸出

Model(
   (conv1): Conv2d(3, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
   (conv2): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
   (conv3): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
   (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
   (linear1): Linear(in_features=1024, out_features=512, bias=True)
   (linear2): Linear(in_features=512, out_features=10, bias=True)
)

更新於:2022年1月25日

301 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.