训练和验证在2个时期内都是健康的,但在2-3个时期之后,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-类别精度:0.5892-损失值:0.7749-类别准确性:0.6558
2/5-损失:1.3908-类别准确性:0.6917-损失值:0.7421-类别准确性:0.6784
3/5-损失:0.9587-类别精度:0.7734-损失值:0.7595-类别准确性:0.6947
4/5-损失:0.6402-类别精度:0.8370-损失值:0.7921-valcategorical_accuracy:0.7216
5/5-损失:0.4520-类别精度:0.8814-损失值:0.8556-类别准确性:0.7331
最终精度= 0.7328754744261703
这似乎是一种过拟合的行为,但是我尝试添加没有帮助的辍学层。我还尝试增加数据,这使结果更糟。
我是深度学习的新手,如果有人有任何改进的建议,请告诉我。
答案 0 :(得分:1)
val_loss不断增加,而Val_acc不断增加。这可能是因为损失函数...损失函数是使用实际的预测概率计算的,而准确性是使用一个热矢量计算的。>
让我们以您的4类示例为例。对于其中一个评论 true 类别,说 1 。系统的预测概率为[0.25,0.30,0.25,0.2]。根据 categorical_accuracy ,您的输出是正确的,即[0,1,0,0],但是由于您的概率质量如此分布... categorical_crossentropy 也将带来很高的损失
关于过度拟合问题。我不太确定为什么引入更多数据会引起问题。
尝试增加步伐。 不要通过将数据添加到任何特定的类来使数据更加不平衡。