python - CNN pytorch:如何选择参数并在层之间流动
问题描述
我对 CNN 很陌生,并且一直在遵循以下代码。我无法理解我们如何以及为什么选择 Conv2d() 和 nn.Linear () 的每个参数,因为它们是输出、过滤器、通道、权重、填充和步幅。我确实理解每个的含义。有人可以非常简洁地解释每一层的流程吗?(输入图像尺寸为 32*32*3)
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
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.fc1 = nn.Linear(64 * 4 * 4, 500)
self.fc2 = nn.Linear(500, 10)
self.dropout = nn.Dropout(0.25)
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, 64 * 4 * 4)
x = self.dropout(x)
x = F.relu(self.fc1(x))
x = self.dropout(x)
x = self.fc2(x)
return x
解决方案
我认为您会发现感受野算术对您的理解很有用。
您的网络有 3 个卷积层,每个卷积层的内核大小为 3x3,填充为 1 个像素,这意味着您的卷积层的空间输出与其输入相同。
每个卷积层后面跟着一个步幅为 2 的最大池化,也就是说,它将空间维度减少了 2 倍。
因此,在空间域中,在第一个 conv 和 pool 之后,您有一个大小为 32x32 的输入,它的尺寸是 16x16,在第二个 conv 和 pool 之后它是 8x8,在第三个 conv+pool 之后它是 4x4。
至于“特征”/“通道”维度:输入有 3 个通道。第一个卷积层有 16 个过滤器 ( "out_channels=16"
),然后是 32 个,最后是 64 个。
因此,在三个卷积层之后,您的特征图有 64 个通道(每个空间位置)。总体而言,在您的网络定义的三个 conv+pooling 层之后,大小为 3x32x32 的输入变为 64x4x4。
nn.Linear
图层不为其输入分配“空间”含义,并期望一维输入(小批量中的每个条目),因此您的函数forward
“消除”空间维度并使用命令转换x
为一维向量。x.view(-1, 64 * 4 * 4)
推荐阅读
- neo4j - 如何在嵌入式 neo4j 中使用“apoc.util.md5”
- javascript - 将 google doc 转换为 pdf 会导致空白 pdf、google 脚本
- azure-devops - 当我尝试通过 VS2017 打开 VSTS 任务时,日期可见但时间不可见
- sql-server - 动态 SQL 查询以查找表的所有列的缺失值计数
- android - RecyclerView 中的并发修改
- c# - Resharper 是否为 C# 类/方法/属性的 Visual Studio 提供了额外的 XML Doc 功能?
- android - 拥有多个 Launcher Activity
- django - 删除旧迁移中使用的过时函数
- node.js - 如何使 Google App Service 公开可见
- python - 将浮点数列表转换为熊猫中的多列浮点数