Внедрение слоев конв в сети lstm - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь создать переводчик с английского на французский. У меня есть базовая модель, которая работает довольно хорошо:

Среднее время шага: 232.3

Окончательный проигрыш: 0.4969

Модель:


Layer (type)                 Output Shape              Param #   
=================================================================
embedding_1 (Embedding)      (None, 15, 336)           67200     
_________________________________________________________________
lstm_1 (LSTM)                (None, 256)               607232    
_________________________________________________________________
repeat_vector_1 (RepeatVecto (None, 21, 256)           0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 21, 256)           0         
_________________________________________________________________
lstm_2 (LSTM)                (None, 21, 256)           525312    
_________________________________________________________________
dropout_2 (Dropout)          (None, 21, 256)           0         
_________________________________________________________________
time_distributed_1 (TimeDist (None, 21, 336)           86352     
=================================================================
Total params: 1,286,096
Trainable params: 1,286,096
Non-trainable params: 0
_________________________________________________________________

Python:

model = Sequential()
model.add(Embedding(en_vocab_size, fr_vocab_size, input_length=en_max_len, mask_zero=True))
model.add(LSTM(256))
model.add(RepeatVector(fr_max_len))
model.add(Dropout(0.5))
model.add(LSTM(256, return_sequences=True))
model.add(Dropout(0.2))
model.add(TimeDistributed(Dense(fr_vocab_size, activation='softmax')))

Затем я попытался реализовать еще один слой LSTM и два 1d сверточных слоя:

Среднее время эпохи: 402 с

Конечная потеря: 1.0899

Layer (type)                 Output Shape              Param #
=================================================================
embedding_1 (Embedding)      (None, 15, 336)           67200
_________________________________________________________________
dropout_1 (Dropout)          (None, 15, 336)           0
_________________________________________________________________
conv1d_1 (Conv1D)            (None, 15, 32)            32288
_________________________________________________________________
max_pooling1d_1 (MaxPooling1 (None, 7, 32)             0
_________________________________________________________________
dropout_2 (Dropout)          (None, 7, 32)             0
_________________________________________________________________
conv1d_2 (Conv1D)            (None, 7, 16)             2064
_________________________________________________________________
max_pooling1d_2 (MaxPooling1 (None, 3, 16)             0
_________________________________________________________________
dropout_3 (Dropout)          (None, 3, 16)             0
_________________________________________________________________
lstm_1 (LSTM)                (None, 128)               74240
_________________________________________________________________
repeat_vector_1 (RepeatVecto (None, 21, 128)           0
_________________________________________________________________
dropout_4 (Dropout)          (None, 21, 128)           0
_________________________________________________________________
lstm_2 (LSTM)                (None, 21, 512)           1312768
_________________________________________________________________
dropout_5 (Dropout)          (None, 21, 512)           0
_________________________________________________________________
lstm_3 (LSTM)                (None, 21, 128)           328192
_________________________________________________________________
dropout_6 (Dropout)          (None, 21, 128)           0
_________________________________________________________________
time_distributed_1 (TimeDist (None, 21, 336)           43344
=================================================================
Total params: 1,860,096
Trainable params: 1,860,096
Non-trainable params: 0
_________________________________________________________________

Python:

model = Sequential()
model.add(Embedding(en_vocab_size, fr_vocab_size, input_length=en_max_len))
model.add(Dropout(0.2))
model.add(Conv1D(filters=32, kernel_size=3, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(Dropout(0.3))
model.add(Conv1D(filters=16, kernel_size=4, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(Dropout(0.2))
model.add(LSTM(128))
model.add(RepeatVector(fr_max_len))
model.add(Dropout(0.2))
model.add(LSTM(256, return_sequences=True))
model.add(Dropout(0.5))
model.add(LSTM(256, return_sequences=True))
model.add(Dropout(0.2))
model.add(TimeDistributed(Dense(fr_vocab_size, activation='softmax')))

Вы можете видеть, что второй тренинг не только занимал больше времени, имел большие потери, но также был гораздо менее точным. С чего бы это? Я предполагаю, что я неправильно реализовал сверточные слои. Каков наилучший способ реализации сверточного слоя в рекуррентной нейронной сети (или сети lstm)?

...