Keras生成的.h5模型转换成TensorFlow的固化.pb模型

TensorFlow版本是1.15.0,没有用2.0版本,用2.0版本会有一些问题,我参考的是https://github.com/amir-abdi/keras_to_tensorflow ,直接运行会报一些错误,我遇到的错误有很多,解决之后就能生成固化模型了

报错1:tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use uninitialized val

原因:sess没有初始化

解决方式:在sess = K.get_session()后加上初始化代码,如下所示

sess = K.get_session()
######## 初始化sess
init = tf.global_variables_initializer()
sess.run(init)
报错2:ImportError: Could not find 'cudart64_100.dll' ,也会出现类似的错误,找不到dll文件
原因:缺少cudart64_100.dll文件
解决方式:下载dll文件放到 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin路径下,这是我的路径,根据自己cuda版本不同放到对应的bin里就可以。

报错3:ValueError: Unknown initializer: GlorotUniform 
原因:加载模型方法不一致的问题,训练保存模型时候用哪种方式,加载的时候也需要用相同的方式,
解决方式:修改load模型的方法,如下所示,可以参考keras文档https://keras.io/getting_started/faq/ 中What are my options for saving models?的回答
from keras.models import load_model
# 将上面的这句话替换成下面的,即可。
from tensorflow.keras.models import load_model

# 在执行此句就不会报错了
model = load_model('lstm_model.h5')
报错4:由于文件中自定义了函数load_model,在解决报错3后,需要修改了文件中的自定义函数名称,如果不修改会有死循环出现
解决方式:修改自定义函数名称,我的修改如下所示
# 原文件函数名称是load_model,我修改为load_model_new,避免与报错3的加载模型函数冲突
def load_model_new(input_model_path, input_json_path=None, input_yaml_path=None):
    print(input_model_path,"input_model_path")
    if not Path(input_model_path).exists():
        raise FileNotFoundError(
            'Model file `{}` does not exist.'.format(input_model_path))
    try:
        # model = keras.models.load_model(input_model_path, compile=False)
        model = load_model(input_model_path)
        return model
修改完成后,在目录下执行如下命令,input_model为h5模型路径 ,output_model=输出模型路径
python keras_to_tensorflow.py --input_model="model.h5" --output_model="model.pb"
 

 

 

你可能感兴趣的:(tensorflow,python,深度学习)