对张量流变量的切片分配
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
之前已被切片,并且显示的操作是后续切片。
感谢您的澄清。非常感谢。以上是关于对张量流变量的切片分配的主要内容,如果未能解决你的问题,请参考以下文章