zoukankan      html  css  js  c++  java
  • keras和tensorflow保存为可部署的pb格式

    github博客传送门
    csdn博客传送门

    Keras保存为可部署的pb格式

    加载已训练好的.h5格式的keras模型
    传入如下定义好的export_savedmodel()方法内即可成功保存
    import keras
    import os
    import tensorflow as tf
    from tensorflow.python.util import compat
    from keras import backend as K
    
    def export_savedmodel(model):
    	'''
    	传入keras model会自动保存为pb格式
    	'''
        model_path = "model/"  # 模型保存的路径
        model_version = 0  # 模型保存的版本
        # 从网络的输入输出创建预测的签名
        model_signature = tf.saved_model.signature_def_utils.predict_signature_def(
            inputs={'input': model.input}, outputs={'output': model.output})
        # 使用utf-8编码将 字节或Unicode 转换为字节
        export_path = os.path.join(compat.as_bytes(model_path), compat.as_bytes(str(model_version)))  # 将保存路径和版本号join
        builder = tf.saved_model.builder.SavedModelBuilder(export_path)  # 生成"savedmodel"协议缓冲区并保存变量和模型
        builder.add_meta_graph_and_variables(  # 将当前元图添加到savedmodel并保存变量
            sess=K.get_session(),  # 返回一个 session 默认返回tf的sess,否则返回keras的sess,两者都没有将创建一个全新的sess返回
            tags=[tf.saved_model.tag_constants.SERVING],  # 导出模型tag为SERVING(其他可选TRAINING,EVAL,GPU,TPU)
            clear_devices=True,  # 清除设备信息
            signature_def_map={  # 签名定义映射
                tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY:  # 默认服务签名定义密钥
                    model_signature  # 网络的输入输出策创建预测的签名
            })
        builder.save()  # 将"savedmodel"协议缓冲区写入磁盘.
        print("save model pb success ...")
    
    model = keras.models.load_model('model_data/weight.h5')  # 加载已训练好的.h5格式的keras模型
    export_savedmodel(model)  # 将模型传入保存模型的方法内,模型保存成功.
    
    

    Tensorflow保存为可部署的pb格式

    1. 在tensorflow绘图的情况下,使用tf.saved_model.simple_save()方法保存模型
    2. 传入session
    3. 传入保存路径
    4. 传入输入占位符在inputs={"input_name": 网络输入占位符变量}
    5. 传入输出变量在outputs={"output_name1": 网络输出变量, "output_name2": 网络输出变量}
    即可成功保存为可部署的pb格式
    tf.saved_model.simple_save(sess,
                "./model",
                inputs={"myInput": x},  # input_name可自定义,编码客户端时对应即可
                outputs={"myOutput": y})
    

    保存好模型后会得到这样格式文件证明你保存没有问题了

    variables/
        variables.data-*****-of-*****
        variables.index
    saved_model.pb
    
    print_r('点个赞吧');
    var_dump('点个赞吧');
    NSLog(@"点个赞吧!")
    System.out.println("点个赞吧!");
    console.log("点个赞吧!");
    print("点个赞吧!");
    printf("点个赞吧!
    ");
    cout << "点个赞吧!" << endl;
    Console.WriteLine("点个赞吧!");
    fmt.Println("点个赞吧!")
    Response.Write("点个赞吧");
    alert(’点个赞吧’)
    
  • 相关阅读:
    【DB宝50】Oracle异构平台迁移之完全可传输导出导入(Full Transportable Export & Import)
    【DB宝49】Oracle如何设置DB、监听和EM开机启动
    【DB宝48】JumpServer:多云环境下更好用的堡垒机
    【DB宝47】企业知识分享+团队协作神器之Confluence
    【DB宝46】NoSQL数据库之CouchBase简介、集群搭建、XDCR同步及备份恢复
    【DB宝45】MySQL高可用之MGR+Consul架构部署
    【DB宝44】Oracle rac集群中的IP类型简介
    【DB宝43】MySQL误操作闪回恢复利器之my2sql
    【DB宝42】MySQL高可用架构MHA+ProxySQL实现读写分离和负载均衡
    【DB宝41】监控利器PMM的使用--监控MySQL、PG、MongoDB、ProxySQL等
  • 原文地址:https://www.cnblogs.com/Mrzhang3389/p/10896561.html
Copyright © 2011-2022 走看看