如何在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 次浏览

启动您的职业生涯

完成课程获得认证

开始学习
广告