tf.assign on tf.concat tensor,drop of tensors of tensors?

时间:2017-12-07 16:30:53

标签: python tensorflow concat assign

我正在尝试使用Python API为Tensorflow神经网络的权重和值设置特定值。为此,我将所有权重和偏差放在一个公共集合中,并进行适当的重新整形,并在每层的张量上使用 tf.concat

在我的代码的某个阶段,我检索所述集合。然而,当我然后尝试 tf.assign (使用相同形状的tf.placeholder)到这些连接的张量时,为了从单个值向量设置所有权重/偏差,例如,坐在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产生的张量不再是变量,因此没有assign属性。我发现了一个相关的问题here,但我的问题并没有像那里建议的那样通过validate_shape解决。

有什么想法吗?这是期望的行为吗?

1 个答案:

答案 0 :(得分:2)

是的,这是一种设计行为,因为c是操作,而不是变量。这是最简单的版本:

c = a + b
tf.assign(c, a)  # Does not work!

基本上,此图表示节点c通过某些操作(concat,addition,等等)依赖于ab。将其他值分配给c与来自ab的值冲突,换句话说,它会破坏计算图。

您应该做的是将d_all拆分为形状[2]的张量,并指定基础ab。这种方式完全有效。