【发布时间】:2019-12-16 17:03:22
【问题描述】:
我正在 Pytorch 上测试预训练的 inception v3 模型。我给它提供了一个 256x256 的图像大小,并将它的大小调整为 299x299。在这两种情况下,图像都被正确分类。
有人能解释一下为什么 PyTorch 预训练模型可以接受不是 299x299 的图像吗?
【问题讨论】:
标签: python machine-learning deep-learning computer-vision pytorch
我正在 Pytorch 上测试预训练的 inception v3 模型。我给它提供了一个 256x256 的图像大小,并将它的大小调整为 299x299。在这两种情况下,图像都被正确分类。
有人能解释一下为什么 PyTorch 预训练模型可以接受不是 299x299 的图像吗?
【问题讨论】:
标签: python machine-learning deep-learning computer-vision pytorch
当aux_logits 为True 时,Inception-v3 将在训练期间与size >= 299 x 299 一起使用,否则它可以与75 x 75 一样小。
原因是当aux_logits在训练期间设置为True时,它在Mixed_6e层之后内部调用InceptionAux,其中包含带有5 x 5内核的二维卷积。现在如果输入图像小于299 x 299,那么Mixed_6e 的输出大小实际上小于InceptionAux 中的内核大小5 x 5。因此,如果 aux_logits 设置为 True,则训练期间图像大小必须 >= 299 x 299。
否则,如果 aux_logits 为 False,我们可以使用较小的输入大小(在您的情况下为 256 x 256),因为模型不会调用 IncpetionAux,因此没有 5 x 5 内核大小卷积。
在测试期间 (model.training = False),即使 aux_logits 为 True,也不会调用 InceptionAux。因此,可以很容易地使用较小的尺寸作为输入。我已经测试过了,它可以工作到75 x 75。
【讨论】:
这是因为 inception v3 的 pytorch 实现在全连接层之前使用了自适应平均池化层。
如果您查看torchvision/models/inception.py 中的Inception3 类,您的问题最感兴趣的操作是x = F.adaptive_avg_pool2d(x, (1, 1))。由于average pooling is adaptivex 在池化之前的高度和宽度与输出形状无关。换句话说,在这个操作之后,我们总是得到一个大小为[b,c,1,1] 的张量,其中b 和c 分别是批量大小和通道数。这样,全连接层的输入总是相同的大小,因此不会引发异常。
也就是说,如果您使用的是预训练的 inception v3 权重,那么该模型最初是针对大小为 299x299 的输入进行训练的。使用不同大小的输入可能会对损失/准确性产生负面影响,尽管较小的输入图像几乎肯定会减少计算时间和内存占用,因为特征图会更小。
【讨论】: