我开发了一个基于lstm层的带有keras的神经网络模型。为了提高paperspace(一个gpu云处理基础设施)的速度,我将lstm层与新的CuDNNLSTM层进行了切换。但是,这仅在支持GPU CUDNN的计算机上可用。ps:cudnnlstm仅在kerasmaster
上可用,不在最新版本中。
因此,我生成了权重并将其保存为云上的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 i分析
hdf5
文件可以看出这两种结构是不同的。DR
我无法将cudnnlstm生成的权重加载到lstm模型中。
我做错事了吗?我怎样才能让他们无缝工作?
这是我的模型:
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')
最佳答案
原因是CuDNNLSTM
层的bias
是LSTM
层的两倍大。这是因为cudnn api的底层实现。您可以将以下方程式(从CUDNN用户指南复制)与常用的LSTM方程式进行比较:
cudnn使用了两个偏倚项,因此偏倚权重的数量增加了一倍。要将其转换回LSTM
使用的值,需要对这两个偏差项求和。
我提交了一个PR来进行转换,它被合并了。您可以从Github安装最新的Keras,重量装载问题应该得到解决。