如何在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) )
广告