Усеченное обратное распространение в кератах с одной последовательностью на партию - PullRequest
0 голосов
/ 08 ноября 2018

Если я правильно понял, чтобы выполнить TBPTT в кератах, мы должны разделить наши последовательности на меньшие части k временных шагов. Чтобы повторно использовать состояние нашего LSTM во всех частях последовательности, мы должны использовать параметр stateful согласно документации keras:

Вы можете установить слои RNN как «с состоянием», что означает, что состояния, вычисленные для выборок в одной партии, будут повторно использоваться в качестве начальных состояний для выборок в следующей партии. Это предполагает однозначное сопоставление между образцами в разных последовательных партиях.

Так что, если я правильно понимаю, 1-й образец 1-й партии - это 1-я часть 1-й последовательности, 1-й образец 2-й партии - это 2-я часть 1-й последовательности и т. Д. У меня 125973 последовательности длиной 1000, что Я разделил на 40 последовательностей k = 25 временных шагов. Поэтому моя модель должна тренироваться в 40 партиях, содержащих 125973 последовательностей по 25 временных шагов. У меня проблема с памятью моего графического процессора (quadro K2200, я плохой), размер партии 125973 кажется слишком большим. Я хотел бы знать, возможно ли сохранить состояние LSTM внутри одной и той же партии и сбрасывать его между партиями, поэтому вместо этого я должен иметь размер партии 40 и 125973 партии.

Вот моя модель:

model = Sequential()
model.add(Embedding(len(char_to_num), 200, mask_zero=True, batch_input_shape=(batch_size, k)))
model.add(Dropout(0.5))
model.add(LSTM(512, activation='relu', return_sequences=True, stateful=True))
model.add(Dropout(0.5))
model.add(TimeDistributed(Dense(len(char_to_num), activation='softmax')))

model.compile(loss='sparse_categorical_crossentropy', optimizer='adam')
model.summary()
...