【发布时间】:2019-08-14 16:15:00
【问题描述】:
训练和验证在 2 个 epoch 中是健康的,但在 2-3 个 epoch 之后,Val_loss 不断增加,而 Val_acc 不断增加。
我正在尝试训练一个 CNN 模型,以将给定的评论分类为 1-5 类。因此,我认为它是一个多类分类。 我将数据集分为 3 组 - 70% 的训练、20% 的测试和 10% 的验证。
5个类的训练数据分布如下。
1 - 31613、2 - 32527、3 - 61044、4 - 140005、5 - 173023。
因此我添加了类权重如下。
{1: 5.47, 2: 5.32, 3: 2.83, 4: 1.26, 5: 1}
模型结构如下。
input_layer = Input(shape=(max_length, ), dtype='int32')
embedding = Embedding(vocab_size, 200, input_length=max_length)(input_layer)
channel1 = Conv1D(filters=100, kernel_size=2, padding='valid', activation='relu', strides=1)(embedding)
channel1 = GlobalMaxPooling1D()(channel1)
channel2 = Conv1D(filters=100, kernel_size=3, padding='valid', activation='relu', strides=1)(embedding)
channel2 = GlobalMaxPooling1D()(channel2)
channel3 = Conv1D(filters=100, kernel_size=4, padding='valid', activation='relu', strides=1)(embedding)
channel3 = GlobalMaxPooling1D()(channel3)
merged = concatenate([channel1, channel2, channel3], axis=1)
merged = Dense(256, activation='relu')(merged)
merged = Dropout(0.6)(merged)
merged = Dense(5)(merged)
output = Activation('softmax')(merged)
model = Model(inputs=[input_layer], outputs=[output])
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['categorical_accuracy'])
model.fit(final_X_train, final_Y_train, epochs=5, batch_size=512, validation_data=(final_X_val, final_Y_val), callbacks=callback, class_weight=class_weights)
1/5 - 损失:1.8733 - categorical_accuracy:0.5892 - val_loss:0.7749 - val_categorical_accuracy:0.6558
2/5 - 损失:1.3908 - categorical_accuracy:0.6917 - val_loss:0.7421 - val_categorical_accuracy:0.6784
3/5 - 损失:0.9587 - categorical_accuracy:0.7734 - val_loss:0.7595 - val_categorical_accuracy:0.6947
4/5 - 损失:0.6402 - categorical_accuracy:0.8370 - val_loss:0.7921 - val_categorical_accuracy:0.7216
5/5 - 损失:0.4520 - categorical_accuracy:0.8814 - val_loss:0.8556 - val_categorical_accuracy:0.7331
最终准确度 = 0.7328754744261703
这似乎是一种过拟合行为,但我尝试添加没有帮助的 dropout 层。我也尝试增加数据,结果更糟糕。
我是深度学习的新手,如果有人有任何改进建议,请告诉我。
【问题讨论】:
-
只要准确性不断提高,增加验证损失是完全可以的。如果不清楚,Google 关于交叉熵损失。我会尝试删除班级权重。尽管它是不平衡的,但每个类仍然有相对大量的样本。相反,我会在每个 epoch 开始时对数据进行洗牌,并尝试训练超过 5 个 epoch。可能需要 50-100 个 epoch。
-
我添加了 EarlyStopping 以在 val_categorical_accuracy 开始下降时停止训练。我设法训练了多达 9 个 epoch,然后 val_accuracy 开始下降,训练停止在 0.76 准确度。在测试集上进行测试后,它给出了类似的准确性。但是损失在 4 个epochs 之后不断增加。
标签: python tensorflow deep-learning classification multilabel-classification