避免使用keras过度拟合序列问题

时间:2019-01-08 11:45:52

标签: python machine-learning keras supervised-learning

我要训练的模型有问题。

这是一个带有注意层的典型序列到序列问题,其中输入是一个字符串,输出是提交的字符串的子字符串。

例如

Input            Ground Truth
-----------------------------
helloimchuck     chuck
johnismyname     john

(这只是一个虚拟数据,不是数据集^^的真实部分)

模型如下:

model = Sequential()
model.add(Bidirectional(GRU(hidden_size, return_sequences=True), merge_mode='concat',
                        input_shape=(None, input_size)))  # Encoder
model.add(Attention())
model.add(RepeatVector(max_out_seq_len))
model.add(GRU(hidden_size * 2, return_sequences=True))  # Decoder
model.add(TimeDistributed(Dense(units=output_size, activation="softmax")))
model.compile(loss="categorical_crossentropy", optimizer="rmsprop", metrics=['accuracy'])

问题出在这里:

enter image description here

如您所见,存在过度拟合。

我正在针对patience=8的验证损失使用提前停止条件。

self.Early_stop_criteria = keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0,
                                                             patience=8, verbose=0,
                                                             mode='auto')

我正在使用一个热向量来拟合模型。

BATCH_SIZE = 64
HIDDEN_DIM = 128

问题是,我尝试使用其他批次大小,其他隐藏维度,10K行,15K行,25K行和现在的50K行的数据集。但是,总是存在过度拟合的问题,我也不知道为什么。

test_size = 0.2validation_split=0.2。这些是我没有更改的唯一参数。

我还要确保数据集可以正确构建。

我唯一的想法是尝试进行另一个验证拆分,也许是0.33而不是0.2

我不知道cross-validation是否会有所帮助。

也许有人有更好的主意,我可以尝试一下。提前致谢。

1 个答案:

答案 0 :(得分:0)

按照kvish的建议,辍学是一个很好的解决方案。

我首先尝试了0.2的下降。

model = Sequential()
model.add(Bidirectional(GRU(hidden_size, return_sequences=True, dropout=0.2), merge_mode='concat',
                            input_shape=(None, input_size)))  # Encoder
model.add(Attention())
model.add(RepeatVector(max_out_seq_len))
model.add(GRU(hidden_size * 2, return_sequences=True))  # Decoder
model.add(TimeDistributed(Dense(units=output_size, activation="softmax")))
model.compile(loss="categorical_crossentropy", optimizer="rmsprop", metrics=['accuracy'])

具有5万行,它可以工作,但仍然过拟合。

因此,我尝试使用0.33的辍学率,并且效果很好。