TensorFlow疑问:无法为assign算子命名及图序列化反序列化问题
TensorFlow计算图序列化/反序列化与assign算子命名疑问解答
我最近在探究TensorFlow如何将计算图序列化与反序列化为protobuf,运行以下Python脚本可生成包含protobuf的checkpoint文件(后续可用于恢复计算图):
import tensorflow as tf # variable w = tf.get_variable(name="weights", dtype=tf.float32, shape=[1], initializer=tf.zeros_initializer, use_resource=True) # placeholders x1 = tf.placeholder(name="x1", dtype=tf.float32) x2 = tf.placeholder(name="x2", dtype=tf.float32) # assign new_w = tf.assign(w, x1, name="assign") new_w_again = tf.assign(w, x2, name="assign_again") # not used # session init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) before = sess.run(w) sess.run(new_w, feed_dict={x1: 10.0}) after = sess.run(w) print("before:", before, "after:", after)
不过我存在一个疑问:为何无法为assign算子设置名称?
其实你已经成功给assign算子设置名称啦!问题大概率出在你误解了tf.assign的name参数作用,或者没找对查看这个名称的正确方式。
咱们来具体捋清楚:
- 当你调用
tf.assign(w, x1, name="assign")时,这个name参数是用来给计算图中生成的Assign节点设置名称,而非修改Python变量new_w的名称。Python变量只是指向计算图节点的一个引用,和节点本身的名称是完全独立的两个概念。 - 你可以通过以下方式验证名称是否生效:在代码中添加几行来获取并查看Assign算子的名称:
# 可放在会话启动前或会话内 assign_op = tf.get_default_graph().get_operation_by_name("assign") print("Assign算子的名称:", assign_op.name) # 也可以查看该算子输出张量的名称 assign_output_tensor = tf.get_default_graph().get_tensor_by_name("assign:0") print("Assign算子输出张量的名称:", assign_output_tensor.name) - 哪怕你定义的
new_w_again没有被实际运行,它对应的Assign节点也已经被命名为assign_again,同样可以通过上面的方法查询到。
这个命名会被正常序列化到protobuf格式的checkpoint中,当后续恢复计算图时,你就能通过这个名称精准找到对应的Assign算子啦。
内容的提问来源于stack exchange,提问作者lucataglia
相关产品推荐
相关产品推荐

