PyTorch 简单卷积神经网络模型 (simpleconv) - 带池化层

本文介绍了在 PyTorch 中构建一个简单的卷积神经网络模型 (simpleconv),并展示了如何添加池化层来降低特征图维度。

模型定义

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

class simpleconv(nn.Module):
    def __init__(self, nclass):
        super().__init__()
        # conv1
        self.conv1 = nn.Conv2d(3, 12, 3, 2)
        self.bn1 = nn.BatchNorm2d(12)
        self.pool1 = nn.MaxPool2d(2)
        # conv2
        self.conv2 = nn.Conv2d(12, 24, 3, 2)
        self.bn2 = nn.BatchNorm2d(24)
        self.pool2 = nn.MaxPool2d(2)
        # conv3
        self.conv3 = nn.Conv2d(24, 48, 3, 2)
        self.bn3 = nn.BatchNorm2d(48)
        self.pool3 = nn.MaxPool2d(2)

        # 三层全连接
        self.fc1 = nn.Linear(48 * 2 * 2, 1200)
        self.fc2 = nn.Linear(1200, 128)
        self.fc3 = nn.Linear(128, nclass)

        self.dropout = nn.Dropout(p=0.5)  # dropout训练

    def forward(self, x):
        x = F.relu(self.bn1(self.conv1(x)))  # torch.Size([128, 12, 23, 23])
        x = self.pool1(x)  # torch.Size([128, 12, 11, 11])
        x = F.relu(self.bn2(self.conv2(x)))  # torch.Size([128, 24, 5, 5])
        x = self.pool2(x)  # torch.Size([128, 24, 2, 2])
        x = F.relu(self.bn3(self.conv3(x)))  # torch.Size([128, 48, 5, 5])
        x = self.pool3(x)  # torch.Size([128, 48, 2, 2])
        x = x.view(-1, 48 * 2 * 2)  # 压缩维度  torch.Size([128, 192])
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.dropout(x)
        x = self.fc3(x)
        return x

if __name__ == '__main__':
    import torch
    x = torch.randn(128, 3, 48, 48)  # 生成随机数字的tensor
    model = simpleconv(4)
    y = model(x)

池化层的作用

在 simpleconv 模型中,加入池化层有助于降低特征图的维度。池化层通过对特征图进行降采样操作,可以减少参数量,提高模型的计算效率,并防止过拟合。

代码解释

  1. __init__ 函数中添加了 nn.MaxPool2d() 函数来定义池化层,并设置池化核大小为 2。
  2. forward 函数中,在每个卷积层之后添加了池化层,并调整了全连接层 fc1 的输入维度,使其与池化后的特征图维度相匹配。

总结

本文介绍了在 PyTorch 中构建一个简单的卷积神经网络模型 (simpleconv),并展示了如何添加池化层来降低特征图维度。池化层可以有效地减少参数量,提高模型的计算效率,并防止过拟合。


原文地址: https://www.cveoy.top/t/topic/R5x 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录