对张量流变量的切片分配

Posted

技术标签:

【中文标题】对张量流变量的切片分配【英文标题】: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 现在拥有一个分配操作。请注意,此分配发生在原地并且不返回新的张量对象。所以重新分配给同一个名字实际上没有意义。 【参考方案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 之前已被切片,并且显示的操作是后续切片。 感谢您的澄清。非常感谢。

以上是关于对张量流变量的切片分配的主要内容,如果未能解决你的问题,请参考以下文章

根据张量流中给定的序列长度数组对 3D 张量进行切片

张量流中张量对象的非连续索引切片(高级索引,如numpy)

使用张量流在 keras 中对损失函数的输入进行切片

由张量流中的索引张量指定的切片二维张量

在 Tensorflow 中使用索引对张量进行切片

如何有效地分配给 TensorFlow 中的张量切片