Neural network 在完全连接的1(fc1)层中,输入展平值来自何处(MNIST示例)

Neural network 在完全连接的1(fc1)层中,输入展平值来自何处(MNIST示例),neural-network,pytorch,conv-neural-network,mnist,Neural Network,Pytorch,Conv Neural Network,Mnist,下面是一些卷积神经网络示例代码,来自Pytorch在github上的示例目录: 如果我理解了这一点,我们需要将最后一个卷积层的输出展平,然后才能将其通过线性层(fc1)。所以,看看这段代码,我们看到第一个完全连接层的输入是:9216 这个数字(9216)从何而来?为了计算线性/完全连接层的输入形状,您还需要查看向前方法和网络输入形状。在MNIST的情况下,我们有一个单通道28x28输入图像。使用来自的以下公式,可以计算每个卷积运算的输出形状。该操作遵循与卷积层相同的输入输出关系 由于展平前输入

下面是一些卷积神经网络示例代码,来自Pytorch在github上的示例目录:

如果我理解了这一点,我们需要将最后一个卷积层的输出展平,然后才能将其通过线性层(fc1)。所以,看看这段代码,我们看到第一个完全连接层的输入是:9216


这个数字(9216)从何而来?

为了计算线性/完全连接层的输入形状,您还需要查看
向前
方法和网络输入形状。在MNIST的情况下,我们有一个单通道28x28输入图像。使用来自的以下公式,可以计算每个卷积运算的输出形状。该操作遵循与卷积层相同的输入输出关系

由于展平前输入的形状为64通道12x12特征映射,因此特征的总大小为
64*12*12=9216

conv2d和max_pool2d操作的输入/输出关系

def转发(自身,x):
“”“对于更改要素形状的每一行,添加注释
表示->“”“
x=self.conv1(x)#[1,28,28]->[32,26,26]
x=F.relu(x)
x=self.conv2(x)#[32,26,26]->[64,24,24]
x=F.relu(x)
x=F.max_pool2d(x,2)#[64,24,24]->[64,12,12]
x=自辍学1(x)
x=火炬。展平(x,1)#[64,12,12]->[9216]
x=self.fc1(x)#[9216]->[128]
x=F.relu(x)
x=自辍学2(x)
x=self.fc2(x)#[128]->[10]
输出=F.log\u softmax(x,dim=1)
返回输出

谢谢您的回答。这是非常简单的解释,我现在能理解了。
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, 3, 1)
        self.conv2 = nn.Conv2d(32, 64, 3, 1)
        self.dropout1 = nn.Dropout2d(0.25)
        self.dropout2 = nn.Dropout2d(0.5)
        self.fc1 = nn.Linear(9216, 128)
        self.fc2 = nn.Linear(128, 10)