为何使用名称获取tf.tuple生成的张量会报错,直接传张量却可行?
问题解析:为什么
tf.tuple命名后无法通过名称获取张量? 这个问题的核心在于**tf.tuple的命名逻辑和返回值本质**,我来给你拆解清楚:
1. tf.tuple到底做了什么?
tf.tuple并不是用来创建新张量的,它的核心作用是添加一个控制依赖操作——确保你传入的所有张量都被计算完成后,才返回原来的输入张量列表。你设置的name='initial_state',是给这个控制依赖操作本身起的名字,而不是给返回的那两个张量命名。
2. 为什么用'initial_state:0'会报错?
当你写sess.run('initial_state:0')时,TensorFlow会去查找名为initial_state的操作的第一个输出张量,但问题是:这个initial_state操作是个没有输出的控制操作!它只负责盯着a和b的计算顺序,本身不会产生任何新的张量输出,自然找不到对应的initial_state:0张量,所以才会抛出那个错误。
3. 为什么直接传state就没问题?
state是tf.tuple返回的原输入张量列表(也就是a和b),这两个张量本身是由tf.zeros创建的,在计算图里有对应的生成操作,所以sess.run(state)能正常找到并运行这些张量的计算逻辑。
如果你想通过名称获取张量,有两种办法:
- 给原始张量直接命名:
import tensorflow as tf a = tf.zeros([10], name='a_tensor') b = tf.zeros([10], name='b_tensor') state = tf.tuple([a, b], name='initial_state') with tf.Session() as sess: s = sess.run('a_tensor:0') # 直接用原始张量的名称获取 - 用
tf.identity包装张量,让tf.tuple返回带命名的新张量:
这时候import tensorflow as tf a = tf.zeros([10]) b = tf.zeros([10]) # 用tf.identity创建新张量,再传入tf.tuple state = tf.tuple([tf.identity(a), tf.identity(b)], name='initial_state') with tf.Session() as sess: s = sess.run('initial_state:0') # 现在就能正常获取了initial_state操作的输出就是这两个tf.identity生成的新张量,它们的名称就是initial_state:0和initial_state:1。
内容的提问来源于stack exchange,提问作者Marc Tim Thiemann
相关产品推荐
相关产品推荐

