我有下面的模型,但它返回了一个错误。不知道为什么。我试过谷歌搜索,但到目前为止没有找到任何东西。我的输入是一个6乘6的numpy数组
class Net(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(1, 16, kernel_size=(3,3), stride=1, padding=0)
self.conv2 = nn.Conv2d(16, 32, kernel_size=(3,3), stride=1, padding=0)
self.conv3 = nn.Conv2d(32, 64, kernel_size=(3,3), stride=1, padding=0)
self.fc1 = nn.Linear(64*4*4, 320)
self.fc2 = nn.Linear(320, 160)
self.out = nn.Linear(160, 2)
def forward(self, x):
x = self.conv1(x)
x = F.relu(x)
x = F.max_pool2d(x, kernel_size=2, stride=2)
x = self.conv2(x)
x = F.relu(x)
x = F.max_pool2d(x, kernel_size=2, stride=2)
x = self.conv3(x)
x = F.relu(x)
x = F.max_pool2d(x, kernel_size=2, stride=2)
x = x.reshape(-1, 64*4*4)
#x = torch.flatten(x)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.out(x)
return F.softmax(x, dim=1)
我的输入是一个6x6 numpy数组,我得到以下错误,知道为什么吗
RuntimeError: Calculated padded input size per channel: (2 x 2). Kernel size: (3 x 3). Kernel size can't be greater than actual input size
每次使用
3
的内核大小进行卷积时,图像的大小在每个维度上都会缩小1
因此,在第一次卷积之后,没有任何填充,您将得到
4 x 4
图像和2 x 2
第二次卷积之后。而大小为3 x 3
的内核显然无法遍历2 x 2
映像,因此会收到错误如果不希望缩小表示,请添加
padding=1
您可以在PyTorchs文档(here)中看到有关
Conv2d
参数的形状如何变化的更多信息,具体请参见“形状”一节下面是您可以做的,我使用了Szymon Maszke提出的
padding=1
。此填充被添加到卷积和maxpooling中输出:
默认情况下,在PyTorch
padding=0
中,因此需要在需要时显式设置padding=1
相关问题 更多 >
编程相关推荐