【发布时间】:2021-03-16 00:23:27
【问题描述】:
我正在尝试在 pytorch 中训练一个 lenet 模型,我的想法是在其中放入任何大小的图像,所以我开始使用 nn.AdaptiveAvgPool2d 但错误来了
mat1 dim 1 必须匹配 mat2 dim 0
这是我的代码
class LeNet5(nn.Module):
def __init__(self, num_classes=10):
super(LeNet5, self).__init__()
self.conv_1 = nn.Conv2d(
in_channels=1, out_channels=32, kernel_size=5, bias=False
)
self.relu_1 = nn.ReLU(inplace=True)
self.maxpool_1 = nn.MaxPool2d(kernel_size=2, stride=2)
self.conv_2 = nn.Conv2d(
in_channels=32, out_channels=256, kernel_size=5, bias=False
)
self.relu_2 = nn.ReLU(inplace=True)
self.maxpool_2 = nn.MaxPool2d(kernel_size=2, stride=2)
self.avgpool = nn.AdaptiveAvgPool2d(output_size=1)
self.flatten = nn.Flatten()
self.fc_1 = nn.Linear(in_features=4096, out_features=120, bias=False)
self.fc_2 = nn.Linear(in_features=120, out_features=84)
self.fc_3 = nn.Linear(in_features=84, out_features=num_classes)
def forward(self, input):
conv_1_output = self.conv_1(input)
relu_1_output = self.relu_1(conv_1_output)
maxpool_1_output = self.maxpool_1(relu_1_output)
conv_2_output = self.conv_2(maxpool_1_output)
relu_2_output = self.relu_2(conv_2_output)
maxpool_2_output = self.maxpool_2(relu_2_output)
flatten_output = self.flatten((self.avgpool(maxpool_2_output).view(maxpool_2_output.shape[0], -1)))
fc_1_output = self.fc_1(flatten_output)
fc_2_output = self.fc_2(fc_1_output)
fc_3_output = self.fc_3(fc_2_output)
return fc_3_output
【问题讨论】:
-
很难从您的代码中看出,但尝试交换:
.view(maxpool_2_output.shape[0], -1)))到.view(-1, maxpool_2_output.shape[0])))。 -
我试过了,它给出了 stack 期望每个张量大小相等,但在条目 0 处得到 [1, 23, 23],在条目 1 处得到 [1, 37, 37]
-
我已经发布了答案,它会起作用的
-
我明白了!它与批次数有关,对于这种可变大小图像的情况,它必须是
numb_batch = 1,而我使用的是numb_batch = 64。 -
批量大小无关紧要
标签: python pytorch conv-neural-network