如何从误报中重新训练模型

数据挖掘 机器学习 深度学习 喀拉斯 训练 公制
2022-02-16 18:16:17

我对深度学习还是有点陌生​​。我仍在苦苦挣扎,随着时间的推移重新训练一个好的模型的最佳实践是什么?

我已经为我的二进制分类问题(火与非火)训练了一个深度模型Keras我有 4K 火灾图像和 8K 非火灾图像(它们是视频帧)。我使用 0.2/0.8 验证/训练拆分进行训练。现在我在一些视频上测试它,我发现了一些误报。我将它们添加到我的负(非触发)集合中,加载之前最好的模型,然后重新训练 100 个 epoch。在这 100 个模型中,我选择了val_loss价值最低的一个。但是当我在同一个视频上测试它时,虽然那些误报消失了,但新的却被引入了!这永远不会结束,如果我遗漏了什么或做错了什么,我想知道。

我应该如何知道哪个模型是最好的?训练/重新训练一个好的模型的最佳实践是什么?我应该如何评估我的模型?

如果有帮助,这是我的简单模型架构:

def create_model():
  model = Sequential()
  model.add(Conv2D(32, kernel_size = (3, 3), activation='relu', input_shape=(300, 300, 3)))
  model.add(MaxPooling2D(pool_size=(2,2)))
  model.add(BatchNormalization())
  model.add(Conv2D(64, kernel_size=(3,3), activation='relu'))
  model.add(MaxPooling2D(pool_size=(2,2)))
  model.add(BatchNormalization())
  model.add(Conv2D(128, kernel_size=(3,3), activation='relu'))
  model.add(MaxPooling2D(pool_size=(2,2)))
  model.add(BatchNormalization())
  model.add(Conv2D(128, kernel_size=(3,3), activation='relu'))
  model.add(MaxPooling2D(pool_size=(2,2)))
  model.add(BatchNormalization())
  model.add(Conv2D(64, kernel_size=(3,3), activation='relu'))
  model.add(MaxPooling2D(pool_size=(2,2)))
  model.add(BatchNormalization())
  model.add(Dropout(0.2))
  model.add(Flatten())
  model.add(Dense(256, activation='relu'))
  model.add(Dropout(0.2))
  model.add(Dense(64, activation='relu'))
  model.add(Dense(2, activation = 'softmax'))

  return model

#....
if retrain_from_prior_model == False:
    model = create_model()
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
else:
    model = load_model("checkpoints/model.h5")
2个回答

在大多数情况下,不应仅使用新数据重新训练经过训练的网络。相反,使用新旧数据从头开始训练网络。

添加新数据并仅在该新数据集上重新训练模型,可能会使您的模型仅适合该新数据,从而忘记训练过的其他数据的一般特征。

此外,您不应仅根据验证损失来选择最终模型,而应根据验证指标来选择模型。例如,在您的情况下,它可能是准确度、精确度、召回率等

您的模型过度拟合训练数据。您正在向训练数据添加更多数据,但模型对这些额外数据过度拟合。

为了减少过拟合,你需要增加正则化。

常见选项:

  • 继续向训练数据集添加数据,直到涵盖所有可能的场景。
  • 添加数据增强。
  • 增加辍学率。