我想找到张量的一部分,然后为其分配一个常数,但是我收到了此错误。 似乎在张量流中不允许分配张量。考虑到这一点,任何人都不知道我该如何完成这项任务?
例如,如果张量是这样的:
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
我还在这里查看了具有相同错误的链接,但是他们提出了一个完全针对与我的代码不匹配的编码的解决方案。
提前谢谢
答案 0 :(得分:1)
如错误消息所述,“'张量'对象不支持项目分配”。但是至少有一种解决方法。一种方法是逐元素地将要更改的每个元素乘以零(在原始矩阵中),然后创建一个具有所有元素零而不需要更改的新矩阵(相同形状)。然后,您可以将它们加在一起以获得所需的矩阵。
如果我了解您对此特定情况正确的解决方案,那么您始终想忽略第一列吗?如果是这样的话,我认为这个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)