2017-10-29 10 views
2

저는 LSTM 레이어를 기반으로 한 Keras로 NN 모델을 개발했습니다. Paperspace (GPU 클라우드 프로세싱 인프라)의 속도를 높이기 위해 LSTM 레이어를 새 CuDNNLSTM 레이어로 전환했습니다. 그러나 이것은 GPU cuDNN을 지원하는 컴퓨터에서만 사용할 수 있습니다. PS : CuDNNLSTM은 Keras master에서만 사용할 수 있으며 최신 릴리스에서는 사용할 수 없습니다.Keras 사용하기, CuDNNLSTM에서 생성 된 가중치를 LSTM 모델에로드하려면 어떻게해야합니까?

그래서 무게를 생성하고이를 구름에 hdf5 형식으로 저장했습니다. MacBook에서 로컬로 사용하고 싶습니다. CuDNNLSTM 계층을 사용할 수 없기 때문에 로컬 설치를 위해서만 다시 LSTM으로 전환했습니다.

이 글을 읽고 tweet about CuDNN from @fchollet 나는 LSTM 모델로 무게를 다시 읽는 것만으로도 효과가있을 것이라고 생각했습니다. 그러나

, 내가 Keras이 오류를 던지고을 가져 오려고 :

Traceback (most recent call last): 
{...} 
tensorflow.python.framework.errors_impl.InvalidArgumentError: Dimension 0 in both shapes must be equal, but are 2048 and 4096 for 'Assign_2' (op: 'Assign') with input shapes: [2048], [4096]. 
{...} 
ValueError: Dimension 0 in both shapes must be equal, but are 2048 and 4096 for 'Assign_2' (op: 'Assign') with input shapes: [2048], [4096] 

나는 두 구조가 다른 것을 알 수 있습니다 h5cat와 hdf5 파일을 분석.

TL; DR

I는 LSTM 모델로 CuDNNLSTM 로부터 생성 된 가중치들을로드 할 수있다. 잘못된 방식으로 뭔가를하고 있습니까? 어떻게하면 원활하게 작동하게 할 수 있습니까?

SelectedLSTM = CuDNNLSTM if is_gpu_enabled() else LSTM 
# ... 
model = Sequential() 
model.add(SelectedLSTM(HIDDEN_DIM, return_sequences=True, input_shape=(SEQ_LENGTH, vocab_size))) 
model.add(Dropout(0.2)) 
model.add(SelectedLSTM(HIDDEN_DIM, return_sequences=False)) 
model.add(Dense(vocab_size)) 
model.add(Activation('softmax')) 

model.compile(loss='categorical_crossentropy', optimizer='rmsprop') 

답변

1

이유는 CuDNNLSTMLSTM의 두 배 큰 bias을 가지고 있다는 것입니다 :

여기 내 모델입니다. 그것은 cuDNN API의 기본 구현 때문입니다.

cuDNN LSTM equations

CuDNN 두 개의 바이어스 용어를 사용하기 때문에 바이어스 무게의 수는 두 배가됩니다 : 당신은 일반적인 LSTM 방정식에 (cuDNN 사용자 설명서에서 복사) 다음 식을 비교할 수 있습니다. 다시 LSTM이 사용하는 것으로 변환하려면 두 개의 바이어스 조건을 합산해야합니다.

변환을 수행하기 위해 PR을 제출했으며 병합되었습니다. GitHub에서 최신 Keras를 설치할 수 있으며 체중 부하 문제를 해결해야합니다.