Избегайте перенастройки в последовательности для решения проблемы с использованием керас - PullRequest
0 голосов
/ 08 января 2019

У меня проблема с моделью, которую я хочу тренировать.

Это типичная проблема 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'])

Проблема заключается в следующем:

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.2 и validation_split=0.2. Это единственные параметры, которые я не изменил.

Я также убедился, что набор данных правильно построен.

Единственная идея, которую я имею, это попытаться с другим разделением проверки, может быть 0.33 вместо 0.2.

Я не знаю, поможет ли cross-validation.

Может, у кого-нибудь есть идея получше, что я мог бы попробовать. Заранее спасибо.

1 Ответ

0 голосов
/ 16 января 2019

Как предложил Квиш, отсев был хорошим решением.

Я впервые попробовал с выпадением 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'])

И с 50К строками это работало, но все равно имело переоснащение.

Итак, я попробовал с выпадением 0,33, и он работал отлично.

...