Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么定义PYNN的合法输入维度?_Python_Neural Network_Pytorch - Fatal编程技术网

Python 什么定义PYNN的合法输入维度?

Python 什么定义PYNN的合法输入维度?,python,neural-network,pytorch,Python,Neural Network,Pytorch,根据教程/示例github,在MNIST数据集上培训的网络定义为: class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 20, 5, 1) self.conv2 = nn.Conv2d(20, 50, 5, 1) self.fc1 = nn.Linear(4*4*50, 500)

根据教程/示例github,在MNIST数据集上培训的网络定义为:

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 20, 5, 1)
        self.conv2 = nn.Conv2d(20, 50, 5, 1)
        self.fc1 = nn.Linear(4*4*50, 500)
        self.fc2 = nn.Linear(500, 10)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = F.max_pool2d(x, 2, 2)
        x = F.relu(self.conv2(x))
        x = F.max_pool2d(x, 2, 2)
        x = x.view(-1, 4*4*50)
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return F.log_softmax(x, dim=1)
该网络训练的图像大小为28x28像素

测试不同大小的图像会产生错误。准确地说:我测试了大小为27x27和32x32的图像,结果显示它们的图像出现了错误;输入大小为29x29时不会创建任何值


28x28的实际尺寸定义在哪里?我可以使用什么公式来区分不同任务的不同输入大小的参数?可以使用不同大小的图像作为输入吗?如何操作?

您可以从第一个完全连接的层(即fc1=Linear4*4*50500)回溯输入图像的大小。fc1的输入为50x4x4 CxHxW,此处50为通道尺寸,从上一个conv2层可以明显看出。因此,当您使用2x2-max_pool2dx,2,2执行池时,conv2-before-max-pooling操作的输出是50x8x8

现在,您可以使用公式W-F+2P/S+1=输出大小来获得卷积运算之前图像的输入大小。这里,W是输入大小,F是过滤器/内核大小,P是使用的填充,S是跨步。因此,W-5+2*0/1+1=8=>W=12

因此,conv2的输入为20x12x12

同样,我们可以按如下方式继续该过程:

conv1的输出,即最大池前:20x24x24 conv1的输入:1x28x28。W-5+2*0/1+1=24=>W=28

因此,输入图像大小为1x28x28

错误是因为完全连接的层需要固定大小的输入,这定义了您的网络。为了传递可变大小的输入,您可能需要将输入转换为网络fc层期望使用的大小,例如裁剪


此外,还有一些网络可以接受可变大小的输入,例如完全卷积网络FCN,它不包含fc层,而只包含conv层。您还可以阅读空间金字塔池在一个名为DeepLab的网络中用于语义分割的内容

稍微更正一下,您得出的结论是输入图像大小为28x28,但所需的输入图像大小可能不完全是28x28,因为op已经指出29x29图像可以正常工作。这取决于卷积层参数和接收到的图像大小。是的@unlut,你是对的。网络的输入映像大小为28x28或29x29或30x30或31x31。我猜最大池本身是隐藏的/仅在转发函数中定义的,正如我所看到的网络在其构造函数中明确定义池层一样?原因也是29,30和31也起作用,因为原则上我们通过两个2x2池将维度除以4,因此4个值的范围最终映射到同一个值?是的,池通常不使用init中的nn定义,因为它没有可学习的参数,所以您可以直接使用函数F api。是的,不同尺寸工作的原因是,所有尺寸都会导致相同的fc层输入,即4x4。
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, ...)