PyTorch 简单卷积神经网络模型 (simpleconv) - 带池化层
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 模型中,加入池化层有助于降低特征图的维度。池化层通过对特征图进行降采样操作,可以减少参数量,提高模型的计算效率,并防止过拟合。
代码解释
- 在
__init__函数中添加了nn.MaxPool2d()函数来定义池化层,并设置池化核大小为 2。 - 在
forward函数中,在每个卷积层之后添加了池化层,并调整了全连接层fc1的输入维度,使其与池化后的特征图维度相匹配。
总结
本文介绍了在 PyTorch 中构建一个简单的卷积神经网络模型 (simpleconv),并展示了如何添加池化层来降低特征图维度。池化层可以有效地减少参数量,提高模型的计算效率,并防止过拟合。
原文地址: https://www.cveoy.top/t/topic/R5x 著作权归作者所有。请勿转载和采集!