2016-09-08 4 views
2

시퀀스 언어 모델에 시퀀스를 구현하려고했습니다. 학습 과정에서 모델은 GloVe에 의해 생성 된 일련의 50d 단어 벡터를 취하고 다음 단어를 의미하는 1-to-V (V는 단어의 크기) 벡터를 출력하므로 다음 단어의 분포로 간주 할 수있다 테스트 과정에서 현재 시간 단계의 입력 단어 벡터에 연결하고 112 단어의 어휘로 시도했습니다.Keras + Theano를 사용하여 LSTM을 순차화할 시퀀스를 피팅 할 때 MemoryError 발생.

다음, 나는 다음과 같은 두 가지 모델을 구축 :

model1 = Sequential() 
model1.add(LSTM(112, return_sequences=True, input_shape=(31, 50))) 

model2 = Sequential() 
model2.add(LSTM(112, return_sequences=True, input_shape=(31, 50))) 
model2.add(TimeDistributed(Dense(112, activation="linear"))) 

내가

model.fit(X, Y, batch_size=128, nb_epoch=256, validation_rate=0.1) 

model1 추락 첫 번째 모델을 맞게했을 때와 MemoryError의를 제기하지만, 두 번째 모델 model2 정상적으로 완료 . X는 (number_of_sentences, max_words_in_one_sentence, 50)의 모양을 가지며, Y는 (number_of_sentences, max_words_in_one_sentence, 112)의 모양을 갖는다. 이 예에서는 number_of_sentences=10000, max_words_in_one_sentence=13입니다.

LSTM 레이어에 새로운 시간 분산 밀도를 추가하고 언어 모델을 구현하려는 모델이 어떤 것인지 궁금합니다.

답변

0

무슨 일이 있었는지 당신의 컴퓨팅 장치 (아마도 GPU)가 메모리가 부족하다는 것입니다. NVIDIA 카드 (대안이 없어서)로 의심됩니다. 따라서 메모리 문제가 발생하는지 확인하려면 nvidia-smi의 출력을 확인하십시오.

백엔드 (Theano 또는 TensorFlow)에 따라 메모리 사용량에 따라 다른 동작이 발생할 수 있으므로 백엔드 전환은 경우에 따라 솔루션이 될 수 있습니다.

Theano를 사용하는 경우 문제는 TimeDistributed 래퍼 일 수 있습니다. 더 배치 크기가 지정되지 않은 경우 TimeDistributed이 작업을 수행합니다 :

K.reshape(x, (-1,) + input_shape[2:]) 

는 그래서 기본적으로 (batchsz,timesteps,units)에서 (batchsz*timesteps,units)x 고쳐. 그러나 reshape는 현재 재구성 된 배열이 C 연속적이지 않은 경우 (데이터가 n 차원 C 배열로 정렬 됨) 새 배열을 할당합니다. 이는 사용자의 경우가 아니라고 생각합니다.

입력 할 때 고정 된 배치 크기를 지정하면 TimeDistributed이 많은 메모리를 할당하지 않고 K.rnn을 사용하여 순차적으로 입력을 통해 작동합니다.