Сеть LSTM не учится на последовательностях. Недооценка или переоснащение с использованием Keras, TF backend - PullRequest
1 голос
/ 11 марта 2019

Заранее спасибо за помощь.

Я работаю над проблемой с последовательностями из 4 символов. У меня около 18 000 последовательностей в тренировочном наборе. Работа с бэкэндом Keras + TensorFlow. Общее количество возможных символов для прогнозирования - 52.

Когда я использую сеть, подобную той, которую вы видите ниже в « Сеть A », с примерно 490 тысячами параметров для обучения, сеть чрезвычайно перегружается, и потери при проверке возрастают как сумасшедшие даже в 300 эпохах. В любом случае, точность проверки не достигает 20%.

Когда я использую « Сеть B » ниже, с параметрами около 8K для обучения, сеть, кажется, не обучается. Точность не превышает 40% даже в 3000 эпох для данных обучения и около 10% для набора проверки.

Я перепробовал множество конфигураций в середине без какого-либо реального успеха.

Есть ли у вас какие-либо рекомендации?

В обоих случаях используется следующая конфигурация:

rms = keras.optimizers.RMSprop(lr=0.01, rho=0.9, epsilon=None, decay=0.0)

model.compile(loss='categorical_crossentropy', optimizer=rms,  metrics=['accuracy'])

Сеть A

Shape of input matrix:
    4 1
Shape of Output:
    57    

Layer (type)                 Output Shape              Param #   
=================================================================
lstm_3 (LSTM)                (None, 4, 256)            264192    
_________________________________________________________________
dropout_2 (Dropout)          (None, 4, 256)            0         
_________________________________________________________________
lstm_4 (LSTM)                (None, 4, 128)            197120    
_________________________________________________________________
dropout_3 (Dropout)          (None, 4, 128)            0         
_________________________________________________________________
lstm_5 (LSTM)                (None, 32)                20608     
_________________________________________________________________
dense_1 (Dense)              (None, 128)               4224      
_________________________________________________________________
dropout_4 (Dropout)          (None, 128)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 57)                7353      
_________________________________________________________________
activation_1 (Activation)    (None, 57)                0         
=================================================================
Total params: 493,497
Trainable params: 493,497
Non-trainable params: 0

"Сеть B"

Shape of input matrix:
4 1
Shape of Output:
57
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_6 (LSTM)                (None, 4, 32)             4352      
_________________________________________________________________
dropout_5 (Dropout)          (None, 4, 32)             0         
_________________________________________________________________
lstm_7 (LSTM)                (None, 16)                3136      
_________________________________________________________________
dropout_6 (Dropout)          (None, 16)                0         
_________________________________________________________________
dense_3 (Dense)              (None, 57)                969       
_________________________________________________________________
activation_2 (Activation)    (None, 57)                0         
=================================================================
Total params: 8,457
Trainable params: 8,457
Non-trainable params: 0

1 Ответ

0 голосов
/ 11 марта 2019

Я вижу, что ваша форма ввода - "4x1", и вы передаете это непосредственно в LSTM, каков формат ввода?Потому что здесь кажется, что на каждом временном шаге (для каждого символа) у вас есть измерение 1 (так, может быть, вы только что передали int?).

Как вы сказали, что имеете дело с последовательностью из 4 символов, у вас естьобрабатывать их как категориальные переменные и правильно их кодировать.

Вы можете, например, one-hot кодировать их или embed они используют EmbeddingLayer до определенного измерения.

...