【问题标题】:CNN pytorch : How are parameters selected and flow between layersCNN pytorch:如何选择参数并在层之间流动
【发布时间】:2020-04-23 03:57:49
【问题描述】:

我是 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

【问题讨论】:

标签: python deep-learning neural-network conv-neural-network pytorch


【解决方案1】:

我想你会发现receptive field arithmetics 对你的理解很有帮助。

您的网络有 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) 命令的一维向量。

【讨论】:

    猜你喜欢
    • 2019-11-01
    • 2020-12-05
    • 2018-11-19
    • 2019-08-15
    • 1970-01-01
    • 2020-10-28
    • 2021-09-11
    • 2017-10-24
    相关资源
    最近更新 更多