【问题标题】:Difference between loading my trained model in a pretrained model and loading it in not pretrained one?在预训练模型中加载我的训练模型和在未预训练模型中加载它之间的区别?
【发布时间】:2021-02-19 04:56:06
【问题描述】:

我为我的任务训练了一个Inception_v3。我有3节课。 训练后,我尝试测试我训练的模型,并使用以下代码加载我的模型:

model = models.inception_v3(pretrained=True, aux_logits=False)  
model.fc = nn.Linear(model.fc.in_features, 3)
model.load_state_dict(torch.load(My Model Path.pth))

下载一个预训练 Inception_v3,更改输出特征并将我的权重加载到这个模型中。 正如我在验证阶段所期望的那样,我获得了非常好的结果。

如果我使用相同的代码但 pretrained=False 测试会非常糟糕。

model = models.inception_v3(pretrained=False, aux_logits=False)  
model.fc = nn.Linear(model.fc.in_features, 3)
model.load_state_dict(torch.load(My Model Path.pth))

由于在我下载的模型中加载了我的权重,因此预训练的 True 或 False 之间应该没有区别。

有人知道有什么变化吗?

【问题讨论】:

    标签: python pytorch conv-neural-network


    【解决方案1】:

    pretrained=Trueinception_v3 模型有额外的影响:它控制输入是否为

    根据训练时使用的方法进行预处理 图像网

    (源代码here)。

    当你设置pretrained=False时,如果你想让事情在测试时具有可比性,你还应该设置transform_input=True

    model = models.inception_v3(pretrained=False, aux_logits=False, transform_input=True)  
    model.fc = nn.Linear(model.fc.in_features, 3)
    model.load_state_dict(torch.load(My Model Path.pth))
    

    如果您想知道,这是preprocessing

    def _transform_input(self, x: Tensor) -> Tensor:
        if self.transform_input:
            x_ch0 = torch.unsqueeze(x[:, 0], 1) * (0.229 / 0.5) + (0.485 - 0.5) / 0.5
            x_ch1 = torch.unsqueeze(x[:, 1], 1) * (0.224 / 0.5) + (0.456 - 0.5) / 0.5
            x_ch2 = torch.unsqueeze(x[:, 2], 1) * (0.225 / 0.5) + (0.406 - 0.5) / 0.5
            x = torch.cat((x_ch0, x_ch1, x_ch2), 1)
        return x
    

    【讨论】:

      猜你喜欢
      • 2020-02-07
      • 2019-07-17
      • 2021-04-05
      • 1970-01-01
      • 2017-08-19
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多