'Tensor'对象不支持项目分配,同时需要在张量数组中进行切片然后执行分配mnet



我想找到张量的一部分,然后为其分配一个常量数,但我收到了此错误。 似乎在张量流中不允许对张量的赋值。考虑到这一点,任何人都知道如何完成这项工作?

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

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 替换任何元素,除了左起的第一个元素。

例如,在上面的示例中,在行=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 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

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

提前谢谢你

正如错误消息所说,"'张量'对象不支持项目分配"。但至少有一个解决方法。一种方法是逐元素将要更改的每个元素乘以零(在原始矩阵中),然后创建一个新矩阵(相同形状),其中包含所有元素零,而不使用要更改的元素。然后你可以把它们加在一起得到所需的矩阵。

如果我了解您针对此特定情况的正确解决方案,您总是想忽略第一列?如果是这样,我认为这个 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)

最新更新