【PyTorch】使用pytorch提供的模型训练inception V3(使用预训练模型)

前言:

最近在用vgg16跑数据,但是参数量实在太大,跑的非常慢,虽然最后结果还算可观。后面又研究了一下GoogLeNet,自己写了inceptionV1的代码,因为跑vgg16一直占着电脑,所以就没有跑,。

在这期间,在小老弟电脑上跑了MobileNet V1,找不到pytorch版的预训练权重,所以从头开始跑,过拟合非常严重,等之后研究一下是什么原因,猜测是数据集不平衡太严重以及没有预训练。

今天直接调用了pytorch的inception V3的代码跑数据,对于这个网络还没有深入研究,所以跑的时候遇到了一些比较低级的问题,但是在百度上也搜不到,最后在Google上找到了解决办法。

问题:

'InceptionOuputs' object has no attribute 'log_softmax'

在Torch 0.4.0上报的错误应该是:

'tuple' object has no attribute 'log_softmax'

 解决方法:

inception系列都有一个辅助分类器,在训练的时候可以选择是否要用辅助分类器,我在训练的时候选择了使用,所以网络的输出是:

       if self.training and self.aux_logits:
           return _InceptionOuputs(x, aux)

 而_InceptionOuputs在代码最上面定义为:

_InceptionOuputs = namedtuple('InceptionOuputs', ['logits', 'aux_logits'])

返回值是tuple类型,但是在train.py中

outputs = model(inputs)

把返回值只赋给了一个值,所以此时outputs是一个tuple类型的值,再将outputs输入到计算损失函数的函数中去的时候,就会报以上错误。

但是为什么版本是0.4.0的时候报的错误不一样呢?

这是因为改版本的代码中返回网络的输出是这么写的:

        if self.training and self.aux_logits:
            return x, aux

根本就没有定义_InceptionOuputs!

不过在Google中搜到的也都是'tuple' object has no attribute 'log_softmax'这个问题的解决方法,关于新版本的问题目前还没有看到。

 

你可能感兴趣的:(pytorch)