【问题标题】:Using pretrained models in Pytorch for Semantic Segmentation, then training only the fully connected layers with our own dataset在 Pytorch 中使用预训练模型进行语义分割,然后使用我们自己的数据集仅训练全连接层
【发布时间】:2020-04-06 20:51:52
【问题描述】:

我正在学习 Pytorch,并试图了解该库如何用于语义分割。 到目前为止我所了解的是,我们可以在 pytorch 中使用预先训练好的模型。我找到了一篇文章,它在 .eval() 模式下使用了这个模型,但我找不到任何关于使用这种模型对我们自己的数据集进行训练的教程。我有一个非常小的数据集,我需要迁移学习来获得结果。我的目标是只用我自己的数据训练 FC 层。如何在 Pytorch 中实现这一点,而不用 OOP 或这么多 .py 文件使代码复杂化。我一直很难在 github 中找到这样的存储库,因为在 OOP 方面我不是最精通的人。直到最近我一直在使用 Keras 进行深度学习,一切都很简单明了。我在 Pycharm 中是否有相同的选项? 我很感激这方面的任何指导。我需要运行一段代码来进行语义分割,我对我需要采取的许多步骤感到非常困惑。

【问题讨论】:

  • 我认为语义分割网络中没有任何全连接层。

标签: pytorch semantic-segmentation


【解决方案1】:

假设您从一个名为 model 的预训练模型开始。所有这些都发生在您向模型传递任何数据之前。

您希望通过查看所有层然后使用model.children() 对它们进行索引来找到要训练的层。运行此命令将显示所有块和层。

list(model.children())

假设您现在已经找到了要微调的层(您描述的 FC 层)。如果您要训练的层是最后 5 个层,您可以抓取除最后 5 个层之外的所有层,以便将它们的 requires_grad 参数设置为 False,这样它们在您运行训练算法时就不会训练。

list(model.children())[-5:]

移除这些层:

layer_list = list(model.children())[-5:]

使用顺序重建模型:

model_small = nn.Sequential(*list(model.children())[:-5])

requires_grad 参数设置为False

for param in model_small.parameters():
    param.requires_grad = False

现在您有一个名为model_small 的模型,它包含除您要训练的层之外的所有层。现在您可以重新附加已删除的层,它们本质上会将requires_grad 参数设置为True。现在,当您训练模型时,它只会更新这些层的权重。

model_small.avgpool_1 = nn.AdaptiveAvgPool2d()
model_small.lin1 = nn.Linear()
model_small.logits = nn.Linear()
model_small.softmax = nn.Softmax()

model = model_small.to(device)

【讨论】:

  • 感谢您的回答,但我没有完全理解。我需要详细说明一下。我何时以及如何在此模型中提供数据以及重新附加意味着什么?
  • @parastoo91 我用一些描述更新了我的答案。有关更多信息,请参阅此 tut:pytorch.org/tutorials/beginner/…
猜你喜欢
  • 2019-11-10
  • 2019-03-23
  • 2017-08-19
  • 2020-05-06
  • 2023-03-14
  • 2021-08-11
  • 2019-05-04
  • 2017-03-02
  • 1970-01-01
相关资源
最近更新 更多