tf.assign 在 tf.concat 张量上,丢弃张量的变量特征?
tf.assign on tf.concat tensor, drops Variable character of tensors?
我正在尝试使用 Python API 为 Tensorflow 神经网络的权重和值设置特定值。为此,我将所有权重和偏差放在一个公共集合中,并进行适当的重塑,并对每一层的张量使用 tf.concat。
在我的代码的某个阶段,我检索了所述集合。但是,当我然后尝试 tf.assign (使用相同形状的 tf.placeholder )到这些连接的张量以便从中设置所有 weights/biases单个值向量,例如坐在feed_dict,然后我得到错误
AttributeError: 'Tensor' object has no attribute 'assign'
我已将我的问题归结为最小工作示例 (MWE),如下所示:
import tensorflow as tf
a=tf.Variable(tf.random_uniform([2], dtype=tf.float32))
b=tf.Variable(tf.random_uniform([2], dtype=tf.float32))
c=tf.concat([a,b], axis=0)
d_all=tf.placeholder(shape=[4], dtype=tf.float32)
d_single=tf.placeholder(shape=[2], dtype=tf.float32)
#e_all=tf.assign(c,d_all)
e_single=tf.assign(a,d_single)
sess=tf.Session()
sess.run(tf.global_variables_initializer())
print(a)
print(d_single)
sess.run(e_single, feed_dict={
d_single: [1,2]
})
print(c)
print(d_all)
#sess.run(e_all, feed_dict={
# d_all: [1,2,3,4]
#})
注释掉的行不起作用,并因同样的错误而失败。似乎 tf.concat 产生的张量不再是可变的,因此没有赋值 属性。我发现了一个相关问题 here,但我的问题并没有按照那里的建议被 validate_shape 解决。
有什么想法吗?这是期望的行为吗?
是的,这是设计的行为,因为 c
是一个操作,而不是一个变量。这是最简单的版本:
c = a + b
tf.assign(c, a) # Does not work!
基本上,该图意味着节点 c
通过某些操作(连接、加法等)依赖于 a
和 b
。将其他值分配给 c
与来自 a
和 b
的值冲突,换句话说,它破坏了计算图。
您应该做的是将 d_all
拆分为形状 [2]
的张量,并分配基础 a
和 b
。这种方式完全有效。
我正在尝试使用 Python API 为 Tensorflow 神经网络的权重和值设置特定值。为此,我将所有权重和偏差放在一个公共集合中,并进行适当的重塑,并对每一层的张量使用 tf.concat。
在我的代码的某个阶段,我检索了所述集合。但是,当我然后尝试 tf.assign (使用相同形状的 tf.placeholder )到这些连接的张量以便从中设置所有 weights/biases单个值向量,例如坐在feed_dict,然后我得到错误
AttributeError: 'Tensor' object has no attribute 'assign'
我已将我的问题归结为最小工作示例 (MWE),如下所示:
import tensorflow as tf
a=tf.Variable(tf.random_uniform([2], dtype=tf.float32))
b=tf.Variable(tf.random_uniform([2], dtype=tf.float32))
c=tf.concat([a,b], axis=0)
d_all=tf.placeholder(shape=[4], dtype=tf.float32)
d_single=tf.placeholder(shape=[2], dtype=tf.float32)
#e_all=tf.assign(c,d_all)
e_single=tf.assign(a,d_single)
sess=tf.Session()
sess.run(tf.global_variables_initializer())
print(a)
print(d_single)
sess.run(e_single, feed_dict={
d_single: [1,2]
})
print(c)
print(d_all)
#sess.run(e_all, feed_dict={
# d_all: [1,2,3,4]
#})
注释掉的行不起作用,并因同样的错误而失败。似乎 tf.concat 产生的张量不再是可变的,因此没有赋值 属性。我发现了一个相关问题 here,但我的问题并没有按照那里的建议被 validate_shape 解决。
有什么想法吗?这是期望的行为吗?
是的,这是设计的行为,因为 c
是一个操作,而不是一个变量。这是最简单的版本:
c = a + b
tf.assign(c, a) # Does not work!
基本上,该图意味着节点 c
通过某些操作(连接、加法等)依赖于 a
和 b
。将其他值分配给 c
与来自 a
和 b
的值冲突,换句话说,它破坏了计算图。
您应该做的是将 d_all
拆分为形状 [2]
的张量,并分配基础 a
和 b
。这种方式完全有效。