【问题标题】:'Tensor' object does not support item assignment while need to slice and then do assignmnet in tensor array'Tensor' 对象不支持项分配,需要切片然后在张量数组中进行分配
【发布时间】:2019-06-11 21:19:55
【问题描述】:

我想找到张量的一部分,然后为其分配一个常数,但我收到了这个错误。 在张量流中似乎不允许分配给张量。考虑到这一点,有人知道我该如何完成这个吗?

例如,如果张量是这样的:

tf_a2 = tf.Variable(([[2, 5, 1, 4, 3],
                      [1, 6, 4, 2, 3],
                      [0, 0, 0, 6, 6],
                      [2, 1, 1, 3, 3],
                      [4, 4, 1, 2, 3]]))

我想在每行中找到它们具有相同值的元素,然后我用 N 替换除左侧第一个元素之外的任何元素。

比如上例中,row=3,三个元素=0,所以 我将最左边的元素保持不变,然后用N 替换具有相同值的右边元素。在同一行中,有两个元素的值为 6,我保留了最左边的元素,并将之后的所有元素替换为 N

在 row=4 ,1 中重复两次,我再次保留最左边的一项并替换任何具有相同值的右侧项。

在 =5 行中,4 又重复了两次。我保留最左边的项目,然后用 N 替换具有相同值的任何项目。

所以对于 N= 9,结果将是:

    [[2 5 1 4 3]
     [1 6 4 2 3]
     [0 9 9 6 9]
     [2 1 9 3 9]
     [4 9 1 2 3]]

我在下面的 numpy 中有正确的代码:

  numpy code:  (a2[:,1:])[a2[:,1:]==a2[:,:-1]] = N

但我需要在 tensorflow 中执行此操作,我尝试了以下代码,尽管它仍然会引发相同的错误:

tf.where(tf.equal(a2[:,1:], a2[:, :-1]),N,a2[:,1:])

The error:
    a2[:,1:][a2[:,1:]==a2[:,:-1]] = N
TypeError: 'Tensor' object does not support item assignment

我也在这里查看了具有相同错误的链接,但他们提出了一个完全关于他们的编码与我的代码不匹配的解决方案。

提前谢谢你

【问题讨论】:

  • 请提供导致上述错误的Minimal, Reproducible Example。还请包括完整的回溯。
  • 好的,我正在添加它
  • @a_guest 谢谢你关注我的问题,我已经更新了,如果我需要添加更多数据,请告诉我。
  • 您的代码示例仍然不是独立的。请使用我们可以复制和粘贴的内容进行更新,以验证您描述的行为。此外,语句“我想找到左右项相同的行,然后将其更改为像N这样的常数。”对我来说不清楚。你能详细说明一下吗?这里的“左”和“右”元素是什么意思?
  • @a_guest 我已经用一个很好的例子和解释更新了我的问题

标签: python numpy tensorflow


【解决方案1】:

正如错误消息所说,“‘张量’对象不支持项目分配”。但至少有一种解决方法。一种方法是按元素将要更改的每个元素乘以零(在原始矩阵中),然后创建一个新矩阵(相同形状),其中所有元素都为零,而没有您要更改的元素。然后您可以将它们加在一起以获得所需的矩阵。

如果我理解您对这种特定情况的 numpy 解决方案是正确的,您总是想忽略第一列吗?如果是这样,我认为这个 tensorflow 解决方案应该适合您(针对 tensorflow 版本 1.13.1 进行了测试和验证)。

import tensorflow as tf
tf.enable_eager_execution()

tf_a2 = tf.Variable(([[2, 5, 1, 4, 3],
                      [1, 6, 4, 2, 3],
                      [0, 0, 0, 6, 6],
                      [2, 1, 1, 3, 3],
                      [4, 4, 1, 2, 3]]))

N=9

first_col_change = tf.zeros([tf_a2.shape[0],1], dtype=tf.int32)
last_cols_change = tf.cast(tf.equal(tf_a2[:,1:], tf_a2[:, :-1]),tf.int32)
change_bool = tf.concat([first_col_change, last_cols_change],axis=-1)
not_change_bool = 1-change_bool
tf_a2_changed = tf_a2*not_change_bool + change_bool*N

print(tf_a2_changed)

给出输出:

tf.Tensor(
[[2 5 1 4 3]
 [1 6 4 2 3]
 [0 9 9 6 9]
 [2 1 9 3 9]
 [4 9 1 2 3]], shape=(5, 5), dtype=int32)

【讨论】:

  • 感谢您关注我的问题,我无法成功运行您的代码,它会引发此错误:FailedPreconditionError(有关回溯,请参见上文):尝试使用未初始化的值变量 [[Node: Variable/read = Identity[ T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:0"](变量)]]
  • 我还用更好的例子更新了这个问题
  • 你使用的是什么 tensorflow 版本?尝试“打印(”TensorFlow Ver:“,tf.__version__)”。您可以尝试“tf.enable_eager_execution()”,它使您能够逐行打印每个张量。非常适合错误搜索。刚刚在这里再次测试了代码,适用于 tensorflow 1.13.1
  • 我有 1.10.0 张量流。你也可以分享你的代码来获得它的输出吗?我只是想仔细检查
  • @sariii 太好了! Tensorflow 1.13.1 是 tensorflow 2.0 的“中间”版本。因此它可以在没有会话等的情况下工作,我认为 1.10.0 不支持。我建议你尝试新版本,因为它在发布时会更类似于新的 2.0,并且更容易进行原型制作。
猜你喜欢
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2016-10-08
  • 2022-01-25
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
相关资源
最近更新 更多