如何在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) )
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP