培训开始后,验证损失立即增加

时间:2020-03-25 14:40:41

标签: python tensorflow machine-learning keras

我正在基于8000个输入的训练模型来预测20个输出的向量,其中两个向量的每个元素都是二进制的。当前的模型架构如下:

model = keras.Sequential([
    keras.layers.Dense(8000, activation='relu', input_shape=(8000,), kernel_initializer="he_normal"),
    keras.layers.BatchNormalization(),

    keras.layers.Dense(600, activation='relu', kernel_initializer="he_normal"),
    keras.layers.BatchNormalization(),

    keras.layers.Dense(600, activation='relu', kernel_initializer="he_normal"),
    keras.layers.Dropout(0.5),

    keras.layers.Dense(600, activation='relu', kernel_initializer="he_normal"),
    keras.layers.Dropout(0.5),

    keras.layers.Dense(20, activation='sigmoid')
])

我正在将SGD优化器与learning_rate=0.1momentum=0.9一起使用。损失函数是binary_crossentropy中的keras.losses.binary_crossentropy,模型以512的批量大小进行训练。Loss on epoch graph

Accuracy on epoch graph

培训开始后,验证损失立即激增。知道为什么会发生吗?我尝试了不同的学习率,损失,并以不同的方式应用归一化和辍学,但没有任何明显的效果。该模型在单独的测试数据集上的结果如下:

TP: 318378
TN: 20708
FP: 61682
FN: 55232
Accuracy: 0.743

感谢您的帮助。

编辑1:

对问题有有用的评论,我将模型更改为:

model = keras.Sequential([
    keras.layers.Dense(8000, activation='relu', input_shape=(8000,), kernel_initializer="he_normal"),
    keras.layers.BatchNormalization(),

    keras.layers.Dense(600, activation='relu'),
    keras.layers.BatchNormalization(),

    keras.layers.Dense(600, activation='relu'),
    keras.layers.Dropout(0.5),

    keras.layers.Dense(20, activation='sigmoid')
])

优化器可以: optimizers.SGD(learning_rate=0.01, momentum=0.9)

批次大小减小为128。结果如下:Accuracy after change Loss after change

TP: 334313
TN: 16027 
FP: 45747 
FN: 59913
Accuracy: 0.768

0 个答案:

没有答案