我正在尝试将tf.keras.layers.CuDNNLSTM
转换为tf.keras.layers.LSTM
(并且将tf.keras.layers.CuDNNGRU
转换为tf.keras.layers.GRU
)。
我从this StackOverflow post和this GitHub PR看到CuDNNLSTM-> LSTM转换是可能的,并且我从this GitHub PR看到转换是可能的,但是我发现有些意外推理过程中的行为,所以我不确定自己是否做得正确。
我现在要做的是通过创建(和训练)一个具有CuDNNLSTM
层的模型...
inputs = tf.keras.Input(shape=(120,))
x = layers.CuDNNLSTM(100)(inputs) # or x = layers.CuDNNGRU(100)(inputs)
outputs = layers.Dense(5, activation='softmax')(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)
...编译和训练模型...
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(...)
...将模型既保存为结构的json,又保存为权重的hdf5文件,然后将其编辑为LSTM
层而不是CuDNNLSTM
层。
model.save_weights('/path/to/weights.h5')
# get json, edit layer name, dump into file
json_config = model.to_json()
with open('/path/to/structure.json', 'w') as json_file:
json_config_ = json.loads(json_config)
layers = json_config_['config']['layers']
for layer in layers:
if layer['class_name'].lower() == 'cudnnlstm':
layer['class_name'] = 'LSTM'
elif layer['class_name'].lower() == 'cudnngru':
layer['class_name'] = 'GRU'
json.dump(json_config_, json_file)
我正在使用'/path/to/weights.h5'
和'/path/to/structure.json'
并将它们转换为coreml以在iphone上进行推断,因此在coreml转换期间可能会失败。在研究coreml转换器之前,我想先检查一下是否正确地进行了从CuDNN层到LSTM / GRU层的转换。 这是从CuDNNLSTM转换为LSTM以及从CuDNNGRU转换为GRU的正确方法吗?还有另一种方法应该做的转换吗?