[英]Pytorch: Size Mismatch during running a test image through a trained CNN
[英]Pass an arbitrary image size to cnn in pytorch
我正在嘗試在 pytorch 中訓練一個 lenet model,想法是將任何大小的圖像放入其中,所以我開始使用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
如果您閱讀有關AdaptiveAvgPool2d的理論,這就是它所說的“我們指定 output 大小並且自動選擇步幅和內核大小以適應需求”
更多信息在這里
因此,您的空間維度由AdaptiveAvgPool2d
而不是特征圖的深度減少。 因此,空間維度將為1x1
,深度仍為256
,使您的self.fc_1 = nn.Linear(in_features=256, out_features=120, bias=False)
而不是self.fc_1 = nn.Linear(in_features=4096, out_features=120, bias=False)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.