【问题标题】:Re-train model with new classes使用新类重新训练模型
【发布时间】:2018-10-26 05:30:24
【问题描述】:

我已经构建了一个包含 2 个类的图像分类器,比如“A”和“B”。我还使用 model.save() 保存了这个模型。

现在,经过一段时间后,需要再添加一个“C”类。是否可以 load_model() 然后只向先前保存的模型添加一个类,以便我们拥有具有 3 个类('A'、'B'和'C')的最终模型,而无需重新训练整个模型,再次为“A”和“B”类?

谁能帮忙?

我试过这个:

我使用 vgg16 作为基础模型并弹出其最后一层,冻结权重并添加一个密集层 (DL2),对其进行训练以预测 2 个类别。

然后我在 DL2 之上添加了一个更密集的层,比如 DL3,冻结权重并仅使用 C 类进行训练,但现在它总是预测 C 类。

【问题讨论】:

    标签: tensorflow machine-learning keras artificial-intelligence convolutional-neural-network


    【解决方案1】:

    只需使用迁移学习,并创建一个新模型。

    model = VGG16(weights='imagenet',
                      include_top=False,
                      input_shape=(150, 150, 3))
    
    model.pop()
    
    base_model_layers = model.output
    pred = Dense(11, activation='softmax')(base_model_layers)
    model = Model(inputs=model.input, outputs=pred)
    
    # Freeze the first layers, before train it
    for layer in model.layers[:-2]:
        layer.trainable = False
    

    【讨论】:

      【解决方案2】:

      您还可以简单地更改最后一层的输出类数量并冻结剩余层的权重。仅重新训练最后一层的权重。

      【讨论】:

      • 谢谢 Suji,我试过了,但没有运气。我使用 vgg16 作为基础模型并弹出它的最后一层,冻结权重并添加一个密集层(DL2),对其进行训练并预测 2 个类别。然后我在 DL2 之上添加了一个更密集的层,冻结权重并仅使用 C 类进行训练,但现在它总是预测 C 类。
      • 在这种情况下,我们应该训练所有三个类 Dilip。因为新添加的密集层只被训练来预测 C 类。我的意思是它的权重被调整为只预测 C 类。我希望用所有三个类数据训练这个网络可以做到这一点。并且使用所有类数据进行重新训练不会花费太多时间,因为它只是接受训练的最后一层。
      • 我举了一个 3 个班级的例子,但在我的例子中,现在有 100 个班级,但它可以在接下来的 3 个月内增加到 500 个,然后在接下来的 6 个月内增加到 ~1000 个。那么每次都很难从头开始训练。谷歌如何更新他们的模型,我相信他们一定不会每次都从头开始:D
      【解决方案3】:

      我认为您应该查看本教程: https://www.tensorflow.org/tutorials/image_retraining.

      简而言之: 您不能采用训练有素的模型,并添加新课程。 您应该进行一些额外的“微调”,可能不是从头开始重新训练模型,但至少要训练分类器(和一些额外的层)。

      【讨论】:

      • 链接失效
      猜你喜欢
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      • 2019-06-18
      • 2017-04-14
      • 2018-08-03
      相关资源
      最近更新 更多