pytorch使用torchvision0.2版本-SqueezeNet报错问题解决:Calculated output size: (5x0x0). Output size is too small


  • pytorch版本:1.0
  • torchvision版本:0.2.0
  • Python版本:3.7

问题描述如下:

RuntimeError: Given input size: (5x12x12). Calculated output size:
(5x0x0). Output size is too small at
c:\a\w\1\s\tmp_conda_3.7_105830\conda\conda-bld\pytorch_1544094179692\work\aten\src\thcunn \generic/SpatialAveragePooling.cu:47

下面为网络结构代码:

from torchvision.models import squeezenet1_0, squeezenet1_1
import torch.nn as nn
import torch

class SqueezeNet0(nn.Module):
    def __init__(self, num_classes=5):
        super(SqueezeNet0, self).__init__()
        self.num_classes = num_classes
        self.squeezenet = squeezenet1_0(pretrained=True)
        self.squeezenet.features[0] = nn.Conv2d(64, 96, kernel_size=7, stride=2)
        final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
        self.squeezenet.classifier[1] = final_conv
    def forward(self, x):
        return self.squeezenet(x)

torchvision 0.2.0定义的squeezenet.py

图片的输入尺寸是200x200;

在我自己的本地python环境下报错,但是在服务器上却没有问题。
查看了源码发现,torchvision 0.2.0版本的中的squeezenet.py定义的最后平均池化操作比较死,平均池化的kernel_size定义的是13,而我查看上一个网络层的输出却是5x12x12,因此输出尺寸太小,不匹配平均池化操作的kernel_size,所以才有输出尺寸为0的报错。

      final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
        self.classifier = nn.Sequential(
            nn.Dropout(p=0.5),
            final_conv,
            nn.ReLU(inplace=True),
            nn.AvgPool2d(13, stride=1)  # 问题所在
        )

torchvision 0.3.0定义的squeezenet.py

服务器的torchvision版本是0.3.0,其可以正常运行一样的代码,查看源码,发现其是这样定义的squeezenet,使用的是nn中定义的自适应平均池化,直接将其池化到1x1的size大小,所以正常运行输入尺寸是200x200大小的图片。

      final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
        self.classifier = nn.Sequential(
            nn.Dropout(p=0.5),
            final_conv,
            nn.ReLU(inplace=True),
            nn.AdaptiveAvgPool2d((1,1)   # 问题所在
        )

希望能帮到大家。
2020.1.4


猜你喜欢

转载自blog.csdn.net/jsk_learner/article/details/103833034
今日推荐