tensorlfow.saved_model的使用

import tensorflow as tf
from tensorflow import saved_model as sm
model_dir =  '/home/test/070807_model'
# 首先定义一个极其简单的计算图
X = tf.placeholder(tf.float32, shape=(3, ),name="input")
scale = tf.Variable([10, 11, 12], dtype=tf.float32,name="w")
y = tf.multiply(X, scale,name="output")
#X = tf.placeholder(tf.float32, shape=(3, ))
#scale = tf.Variable([10, 11, 12], dtype=tf.float32)
#y = tf.multiply(X, scale)
# 在会话中运行
with tf.Session() as sess:
    sess.run(tf.initializers.global_variables())
    value = sess.run(y, feed_dict={X: [1., 2., 3.]})
    print(value)
    
    # 准备存储模型
    path = model_dir
    builder = sm.builder.SavedModelBuilder(path)
    
    # 构建需要在新会话中恢复的变量的 TensorInfo protobuf
    X_TensorInfo = sm.utils.build_tensor_info(X)
    scale_TensorInfo = sm.utils.build_tensor_info(scale)
    y_TensorInfo = sm.utils.build_tensor_info(y)
    
    # 构建 SignatureDef protobuf
    SignatureDef = sm.signature_def_utils.build_signature_def(
                                inputs={'X': X_TensorInfo, 'w': scale_TensorInfo},
                                outputs={'y': y_TensorInfo},
                                method_name='test'
    )

    # 将 graph 和变量等信息写入 MetaGraphDef protobuf
    # 这里的 tags 里面的参数和 signature_def_map 字典里面的键都可以是自定义字符串,TensorFlow 为了方便使用,不在新地方将自定义的字符串忘记,可以使用预定义的这些值
    builder.add_meta_graph_and_variables(sess, tags=[sm.tag_constants.TRAINING], 
                                         signature_def_map={sm.signature_constants.CLASSIFY_INPUTS: SignatureDef}
  ) 

    # 将 MetaGraphDef 写入磁盘
    builder.save()

[10. 22. 36.]
INFO:tensorflow:No assets to save.
INFO:tensorflow:No assets to write.
INFO:tensorflow:SavedModel written to: /home/test/070807_model/saved_model.pb

 

import tensorflow as tf
from tensorflow import saved_model as sm


# 需要建立一个会话对象,将模型恢复到其中
with tf.Session() as sess:
    path = model_dir
    MetaGraphDef = sm.loader.load(sess, tags=[sm.tag_constants.TRAINING], export_dir=path)

    # 解析得到 SignatureDef protobuf
    SignatureDef_d = MetaGraphDef.signature_def
    SignatureDef = SignatureDef_d[sm.signature_constants.CLASSIFY_INPUTS]

    # 解析得到 3 个变量对应的 TensorInfo protobuf
    X_TensorInfo = SignatureDef.inputs['X']
    scale_TensorInfo = SignatureDef.inputs['w']
    y_TensorInfo = SignatureDef.outputs['y']

    # 解析得到具体 Tensor
    # .get_tensor_from_tensor_info() 函数中可以不传入 graph 参数,TensorFlow 自动使用默认图
    X = sm.utils.get_tensor_from_tensor_info(X_TensorInfo, sess.graph)
    scale = sm.utils.get_tensor_from_tensor_info(scale_TensorInfo, sess.graph)
    y = sm.utils.get_tensor_from_tensor_info(y_TensorInfo, sess.graph)

    print(sess.run(scale))
    print(sess.run(y, feed_dict={X: [3., 2., 1.]}))

INFO:tensorflow:Restoring parameters from /home/test/070807_model/variables/variables
[10. 11. 12.]
[30. 22. 12.]

这里的"x","w","y"需要与build_signature_def定义有关,通过签名来定义id;与前面训练推理部分完全独立;

print(X_TensorInfo.name)
print(scale_TensorInfo.name)
print(y_TensorInfo.name)

input_1:0
w_1:0
output_1:0

转载自:https://www.cnblogs.com/mbcbyq-2137/p/10044837.html

 

个人使用心得:Input值为placeholder,output即为需要输出的值;output会保存所有对应的值,包括神经网络权重等;等同于sess.run需要输入啥,就Input啥;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值