【问题标题】:Slice assignment to tensorflow variable对张量流变量的切片分配
【发布时间】:2019-03-20 07:58:30
【问题描述】:

我正在尝试将值分配给 tensorflow 中的变量切片,但显示以下错误:'ValueError: Sliced assignment is only supported for variables'。为什么即使我尝试对变量进行切片分配,也会显示此错误。我的代码是这样的:

var1 = var1[startx:endx,starty:endy].assign(tf.ones([endx-startx,endy-starty],dtype=tf.int32))

其中var1 是一个张量流变量。

【问题讨论】:

  • 你能展示创建var1的代码吗?也请张贴print(var1); print(type(var1))的输出。
  • 欢迎来到 Stack Overflow!你能告诉我们var1最初是如何定义的吗?或者至少可以重现完全相同的错误?通过创建一个合适的minimal reproducible example,回答这个问题会容易得多。
  • @a_guest var1 是否被变量节点正确实例化并不重要——切片操作已经导致了这个错误。 (当然在给定的 sn-p 之外可能还有更多问题!)
  • 由于您将assign 操作分配回var1,我怀疑您之前已经这样做了,var1 现在拥有一个分配操作。请注意,此分配发生在原地并且不返回新的张量对象。所以重新分配给同一个名字实际上没有意义。

标签: python variables tensorflow slice assign


【解决方案1】:

另一个答案是正确的;对 tf 变量执行任何操作都不会(总是)返回 tf 变量。因此,如果您要链接分配,请使用显式控制依赖项:

v = tf.Variable(...)
with tf.control_dependencies([v[...].assign(...)]):
  return v[...].assign(...)

【讨论】:

    【解决方案2】:

    一旦var1 被切片,它就不再是一个变量。

    numpy 风格的切片符号 (tensor[a:b]) 只是更长的张量流符号 tf.slice(tensor, a, a+b) 的简写,它在图上输出一个新的张量运算(参见 https://www.tensorflow.org/api_docs/python/tf/slice)。

    您尝试制作的图表如下所示(括号中表示张量输出类型):

    Var1 (tf.Variable) -> tf.slice (tf.Tensor) 张量 -> tf.assign (tf.Variable)。

    由于 assign 仅适用于 tf.Variable 对象,因此它不能适用于切片操作的输出。

    【讨论】:

    • 试试tf.Variable([1., 2])[0:1].assign(tf.ones((1,)))。更有可能var1 之前已被切片,并且显示的操作是后续切片。
    • 感谢您的澄清。非常感谢。
    猜你喜欢
    • 2017-12-01
    • 1970-01-01
    • 2018-03-15
    • 2019-11-02
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 2019-11-05
    相关资源
    最近更新 更多