torchvision0.2版本-SqueezeNet报错问题解决
- 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