Python 在PyTorch中的许多conv层之后,如何指定展平层输入大小?

Python 在PyTorch中的许多conv层之后,如何指定展平层输入大小?,python,python-3.x,pytorch,Python,Python 3.x,Pytorch,这是我的问题,我在CIFAR10数据集上做了一个小测试,如何在PyTorch中指定展平层输入大小?如下所示,输入大小是16*5*5,但是我不知道如何计算,我想通过一些函数得到输入大小。有人能在这个Net类中编写一个简单的函数来解决这个问题吗 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3,6,5)

这是我的问题,我在CIFAR10数据集上做了一个小测试,如何在PyTorch中指定展平层输入大小?如下所示,输入大小是16*5*5,但是我不知道如何计算,我想通过一些函数得到输入大小。有人能在这个Net类中编写一个简单的函数来解决这个问题吗

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3,6,5)  
        self.conv2 = nn.Conv2d(6,16,5)

        # HERE , the input size is 16*5*5, but I don't know how to get it.
        self.fc1 = nn.Linear(16*5*5, 120)
        self.fc2 = nn.Linear(120,84)
        self.fc3 = nn.Linear(84,10)

    def forward(self, x):
        x = F.max_pool2d(F.relu(self.conv1(x)),(2,2))
        x = F.max_pool2d(F.relu(self.conv2(x)),2)
        x = x.view(x.size()[0],-1)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

第一个FC层的输入大小取决于输入的大小。将告诉您给定输入的Conv2d层的输出大小,因此您只需将该公式转换为函数。在您的情况下,如果您的输入图像是m×n,那么您要查找的输入大小将是16*(m-8)*(n-8)。

默认设置中没有展平层。您可以创建如下所示的类。干杯

class Flatten(nn.Module):
    def forward(self, input):
        return input.view(input.size(0), -1)


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.flatten   = Flatten()  ## describing the layer
        self.conv1 = nn.Conv2d(3,6,5)  
        self.conv2 = nn.Conv2d(6,16,5)

        # HERE , the input size is 16*5*5, but I don't know how to get it.
        self.fc1 = nn.Linear(16*5*5, 120)
        self.fc2 = nn.Linear(120,84)
        self.fc3 = nn.Linear(84,10)

    def forward(self, x):
        x = F.max_pool2d(F.relu(self.conv1(x)),(2,2))
        x = F.max_pool2d(F.relu(self.conv2(x)),2)
        #x = x.view(x.size()[0],-1)
        x = self.flatten(x)   ### using of flatten layer
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

我猜这是pytorch教程的一点代码,对吧? 我也遇到了同样的问题,Jens Petersen是对的:完全连接(FC)层的输入大小取决于输入大小以及在FC层之前对其执行的操作。在您的情况下,您忘记考虑最大池步骤。
由于该网络采用32x32输入,第一个连接层输出一个6*(32-3)*(32-3),这在最大化6*floor(29/2)*floor(29/2)=6*14*14后给出。在第二个conv layer+max pooling之后,我们有一个大小为16*5*5的输出。

刚刚回复更新这篇文章,Pytorch中现在有一个
nn.flatte()
层,从1.3开始:

另外,值得一提的是,如果您不能使用>=1.3并且“需要”CNN输出大小(例如,如果您有多个头部,大多数人都会通过编程方式从虚拟输入获取输出,例如:

def get_flat_fts(self、input_shape、conv_net):
f=conv_net(变量(torch.one(1,*输入_形状)))
返回int(np.prod(f.size()[1:]))

尽管这是一个古老的问题,但我将为未来的读者解答。5x5是所有卷积和池之后的图像维度。在中,有一个公式可以计算: Hight_out=(Hight_in+2*填充-膨胀*(内核大小-1)-1)/stride+1。宽度相同。 所以你从一个32x32的图像开始。在第一个卷积层之后,由于内核的大小,你得到了一个28x28的图像(每边损失了2个像素)。在池化之后,您得到了14x14,因为它是一个跨距为2的2x2掩码。然后,第二个卷积层为您提供了10x10图像,最后一个池化为5x5。然后乘以输出通道数:16


我认为@trizard answer很接近,但他误读了内核大小。

等等……问题仍然存在。虽然使用您自定义的展平层,但我仍然需要指定fc1的输入大小,即16*5*5。@gaoquanliang您不能这样做。这意味着“我想为每次迭代更改图形”在这种情况下,模型学不到任何东西。在任何框架中都没有这样的选项。换句话说,阿法金,你能告诉我如何获得fc1 16*5*5的输入大小吗?@gaoquanliang看看什么是卷积层、内核大小等。你应该了解层是如何变化的