Python CNN pytorch:如何选择参数并在层之间流动

Python CNN pytorch:如何选择参数并在层之间流动,python,deep-learning,neural-network,conv-neural-network,pytorch,Python,Deep Learning,Neural Network,Conv Neural Network,Pytorch,我是CNN的新手,一直遵循以下代码。我无法理解我们如何以及为什么选择Conv2d()和nn.Linear()的每个参数,即输出、过滤器、通道、权重、填充和步幅。不过,我确实理解每一项的含义。有人能非常简洁地解释每一层的流程吗?(输入图像大小为32*32*3) 我想你会发现这对你的理解很有用 您的网络有3个卷积层,每个层的内核大小为3x3,填充为1像素,这意味着您的卷积层的空间输出与其输入相同。 每个conv层后面都有一个最大池,步幅为2,也就是说,它将空间维度减少了2倍 因此,在空间域中,在第一

我是CNN的新手,一直遵循以下代码。我无法理解我们如何以及为什么选择Conv2d()和nn.Linear()的每个参数,即输出、过滤器、通道、权重、填充和步幅。不过,我确实理解每一项的含义。有人能非常简洁地解释每一层的流程吗?(输入图像大小为32*32*3)

我想你会发现这对你的理解很有用

您的网络有3个卷积层,每个层的内核大小为3x3,填充为1像素,这意味着您的卷积层的空间输出与其输入相同。
每个conv层后面都有一个最大池,步幅为2,也就是说,它将空间维度减少了2倍

因此,在空间域中,在第一个conv和pool之后有一个大小为32x32的输入,其尺寸为16x16,在第二个conv和pool之后是8x8,在第三个conv+pool之后是4x4

对于“功能”/“通道”维度:输入有3个通道。第一个conv层有16个过滤器(
“out\u channels=16”
),然后是32个,最后是64个。
因此,在三个conv层之后,要素地图有64个通道(每个空间位置)。 总的来说,在网络定义的三个conv+池层之后,大小为3x32x32的输入变为64x4x4

nn.Linear
层不为其输入分配“空间”含义,并期望1D输入(小批量中的每个条目),因此您的
forward
函数“消除”空间维度,并使用
x.view(-1,64*4*4)将
x
转换为1D向量
命令。

我想你会发现对你的理解很有用

您的网络有3个卷积层,每个层的内核大小为3x3,填充为1像素,这意味着您的卷积层的空间输出与其输入相同。
每个conv层后面都有一个最大池,步幅为2,也就是说,它将空间维度减少了2倍

因此,在空间域中,在第一个conv和pool之后有一个大小为32x32的输入,其尺寸为16x16,在第二个conv和pool之后是8x8,在第三个conv+pool之后是4x4

对于“功能”/“通道”维度:输入有3个通道。第一个conv层有16个过滤器(
“out\u channels=16”
),然后是32个,最后是64个。
因此,在三个conv层之后,要素地图有64个通道(每个空间位置)。 总的来说,在网络定义的三个conv+池层之后,大小为3x32x32的输入变为64x4x4

nn.Linear
层不为其输入分配“空间”含义,并期望1D输入(小批量中的每个条目),因此您的
forward
函数“消除”空间维度,并使用
x.view(-1,64*4*4)将
x
转换为1D向量
命令。

我建议您阅读以下内容:我建议您阅读以下内容:
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