Python conv2d后的PyTorch CNN线性层形状

Python conv2d后的PyTorch CNN线性层形状,python,pytorch,torch,Python,Pytorch,Torch,我试图学习Pytork,遇到了一个教程,其中CNN的定义如下 class Net(Module): def __init__(self): super(Net, self).__init__() self.cnn_layers = Sequential( # Defining a 2D convolution layer Conv2d(1, 4, kernel_size=3, stride=1, pa

我试图学习Pytork,遇到了一个教程,其中CNN的定义如下

class Net(Module):   
    def __init__(self):
        super(Net, self).__init__()

        self.cnn_layers = Sequential(
            # Defining a 2D convolution layer
            Conv2d(1, 4, kernel_size=3, stride=1, padding=1),
            BatchNorm2d(4),
            ReLU(inplace=True),
            MaxPool2d(kernel_size=2, stride=2),
            # Defining another 2D convolution layer
            Conv2d(4, 4, kernel_size=3, stride=1, padding=1),
            BatchNorm2d(4),
            ReLU(inplace=True),
            MaxPool2d(kernel_size=2, stride=2),
        )

        self.linear_layers = Sequential(
            Linear(4 * 7 * 7, 10)
        )

    # Defining the forward pass    
    def forward(self, x):
        x = self.cnn_layers(x)
        x = x.view(x.size(0), -1)
        x = self.linear_layers(x)
        return x
我了解cnn_层是如何制作的。在cnn_层之后,应将数据展平并提供给线性_层

我不明白要线性化的功能的数量是如何
4*7*7
。我知道4是最后一个Conv2d层的输出维度

7*7
如何进入画面?步幅或填充在其中起了什么作用


输入图像形状为[1,28,28]

Conv2d
层的内核大小为3,跨距和填充为1,这意味着它不会更改图像的空间大小。有两个
MaxPool2d
层将空间维度从
(H,W)
减少到
(H/2,W/2)
。因此,对于每个批次,具有4个输出通道的最后一次卷积的输出的形状为
(批次大小,4,H/4,W/4)
。在向前传球中,特征张量被
x=x.view(x.size(0),-1)
展平,从而使其成为
(批次大小,H*W/4)
。我假设H和W是28,对于这两个值,线性层实际上会采用形状
(batch_size,196)
的输入, 在二维卷积层中,矩阵[2D张量]中的特征[Value], 像往常一样,神经网络最后是一个完全连接的层,后面是一个连接层。 因此,向量[1D张量]中完全连通层中的特征。 因此,我们必须将最后一个度量中的每个特征[值]映射到完全连接的层中。 在pytorch中,完全连接层的实现是
线性
类。
第一个参数是输入特征的数量:
在这种情况下

input_image : (28,28,1)
after_Conv2d_1 : (28,28,4) <- because of the padding : if padding := 0 then (26,26,1)
after_maxPool_1 : (14,14,4) <- due to the stride of 2
after_Conv2D_2 : (14,14,4) <- because this is "same" padding
after_maxPool_2 : (7,7,4)
input_图像:(28,28,1)

_Conv2d_1:(28,28,4)输入图像的形状是什么?28x28单通道据我所知,完全连接层中的神经元数量不需要与卷积层的输出相同。如果第一个FC层中有30个神经元,而conv层的输出是4*7*7,那么仍然可以有30个,10是输出维度,30是隐藏层维度,可以有任意数量的输入。@cerofrais nope,这不是它的工作方式。谢谢