У меня проблема с моделью, которую я хочу тренировать.
Это типичная проблема seq-to-seq со слоем внимания, где вход является строкой, а вывод - подстрокой из представленной строки.
например.
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'])
Проблема заключается в следующем:
Как видите, есть переоснащение.
Я использую критерий ранней остановки потери проверки с 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.2
и validation_split=0.2
. Это единственные параметры, которые я не изменил.
Я также убедился, что набор данных правильно построен.
Единственная идея, которую я имею, это попытаться с другим разделением проверки, может быть 0.33
вместо 0.2
.
Я не знаю, поможет ли cross-validation
.
Может, у кого-нибудь есть идея получше, что я мог бы попробовать. Заранее спасибо.