【问题标题】:tf.assign on tf.concat tensor, drops Variable character of tensors?tf.concat 张量上的 tf.assign,丢弃张量的变量字符?
【发布时间】:2018-05-21 19:50:10
【问题描述】:

我正在尝试使用 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 解决。

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

【问题讨论】:

    标签: python tensorflow concat assign


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的快速回复!我曾认为 concat 在被分配时会映射回变量。在这方面,它也与您对两个节点求和的示例完全不同。更接近的可能是 a=tf.Variable(tf.random_uniform(shape=[2,1]))
    • 请编辑某人,花了我超过 5 分钟...我的意思是说:concat 是一对一并插入,a+b 不是。因此,具有相同行为的 tf.reshape 将是一个更好的例子。
    猜你喜欢
    • 2022-01-10
    • 2016-07-04
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2016-11-17
    • 2017-12-01
    • 1970-01-01
    • 2021-07-03
    相关资源
    最近更新 更多