keras和tf.keras模型之间的兼容性
我感兴趣的是在tf.keras中训练一个模型,然后用keras加载它。我知道这不是很明智,但我对使用tf.keras来训练模型感兴趣,因为keras和tf.keras模型之间的兼容性,keras,tf.keras,coremltools,Keras,Tf.keras,Coremltools,我感兴趣的是在tf.keras中训练一个模型,然后用keras加载它。我知道这不是很明智,但我对使用tf.keras来训练模型感兴趣,因为 tf.keras更容易构建输入管道 我想利用tf.dataset API 我有兴趣把keras装进去因为 我想使用coreml将模型部署到ios 我想使用coremltools将我的模型转换为ios,coreml工具只适用于keras,而不适用于tf.keras 我遇到了一些障碍,因为不是所有的tf.keras层都可以作为keras层加载。例如,我使用简单的
time\u major
。我的RNN层具有time\u major=False
,这与keras的行为相同,但keras顺序层没有此参数
我现在的解决方案是将tf.keras模型保存在一个json文件中(用于模型结构),删除keras不支持的部分图层,并保存一个h5文件(用于权重),如下所示:
model = # model trained with tf.keras
# save json
model_json = model.to_json()
with open('path_to_model_json.json', 'w') as json_file:
json_ = json.loads(model_json)
layers = json_['config']['layers']
for layer in layers:
if layer['class_name'] == 'SimpleRNN':
del layer['config']['time_major']
json.dump(json_, json_file)
# save weights
model.save_weights('path_to_my_weights.h5')
with CustomObjectScope({'GlorotUniform': glorot_uniform()}):
coreml_model = coremltools.converters.keras.convert(
model=('path_to_model_json','path_to_my_weights.h5'),
input_names=#inputs,
output_names=#outputs,
class_labels = #labels,
custom_conversion_functions = { "GlorotUniform": tf.keras.initializers.glorot_uniform
}
)
coreml_model.save('my_core_ml_model.mlmodel')
然后,我使用coremlconverter工具将keras转换为coreml,如下所示:
model = # model trained with tf.keras
# save json
model_json = model.to_json()
with open('path_to_model_json.json', 'w') as json_file:
json_ = json.loads(model_json)
layers = json_['config']['layers']
for layer in layers:
if layer['class_name'] == 'SimpleRNN':
del layer['config']['time_major']
json.dump(json_, json_file)
# save weights
model.save_weights('path_to_my_weights.h5')
with CustomObjectScope({'GlorotUniform': glorot_uniform()}):
coreml_model = coremltools.converters.keras.convert(
model=('path_to_model_json','path_to_my_weights.h5'),
input_names=#inputs,
output_names=#outputs,
class_labels = #labels,
custom_conversion_functions = { "GlorotUniform": tf.keras.initializers.glorot_uniform
}
)
coreml_model.save('my_core_ml_model.mlmodel')
我的解决方案似乎有效,但我想知道是否有更好的方法?或者,这种做法是否存在迫在眉睫的危险?例如,有没有更好的方法将tf.keras模型转换为coreml?还是有更好的方法将tf.keras模型转换为keras?还是有更好的方法,我还没有想到
关于此事的任何建议都将不胜感激:)我觉得你的方法很好 过去,当我不得不将
tf.keras
模型转换为keras
模型时,我做了以下工作:
tf.keras中的列车模型
- 仅保存权重
tf\u模型。保存权重(“tf\u模型.hdf5”)
- 使用Keras中的所有层制作Keras模型架构(与tf Keras相同)
- 按keras中的图层名称加载权重:
keras\u模型。加载权重(按\u name=True)