小编Van*_*orm的帖子

如何计算 CNN 第一个线性层的维度

目前,我正在使用 CNN,其中附加了一个完全连接的层,并且我正在使用尺寸为 32x32 的 3 通道图像。我想知道是否有一个一致的公式可以用来计算第一个线性层的输入尺寸和最后一个卷积/最大池层的输入。我希望能够计算第一个线性层的尺寸,仅给出最后一个 conv2d 层和 maxpool 的信息。换句话说,我希望能够计算该值,而不必使用之前层的信息(因此我不必手动计算非常深的网络的权重维度)

我还想了解可接受尺寸的计算,例如这些计算的推理是什么?

由于某种原因,这些计算有效并且 Pytorch 接受了这些尺寸:

val = int((32*32)/4)
self.fc1 = nn.Linear(val, 200)
Run Code Online (Sandbox Code Playgroud)

这也有效

self.fc1 = nn.Linear(64*4*4, 200)
Run Code Online (Sandbox Code Playgroud)

为什么这些值有效?这些方法的计算是否有限制?例如,我觉得如果我要改变步幅距离或内核大小,这就会中断。

这是我正在使用的一般模型架构:

# define the CNN architecture
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # convolutional layer
        self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, padding=1)
        # max pooling layer
        self.pool = nn.MaxPool2d(2, 2)  


        self.conv2 = nn.Conv2d(in_channels=16, out_channels=32,kernel_size=3)
        self.pool2 = nn.MaxPool2d(2,2)

        self.conv3 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3)
        self.pool3 = nn.MaxPool2d(2,2)
        
        self.dropout = nn.Dropout(0.25)

        # H*W/4
        val = int((32*32)/4)
        #self.fc1 …
Run Code Online (Sandbox Code Playgroud)

python dimensions neural-network conv-neural-network pytorch

3
推荐指数
1
解决办法
3658
查看次数