Объект 'Tensor' не поддерживает присваивание элементов, хотя необходимо нарезать, а затем выполнять assignmnet в тензорном массиве - PullRequest
0 голосов
/ 12 июня 2019

Я хочу найти часть тензора и затем присвоить ему постоянное число, но я получил эту ошибку.Похоже, что в тензорном потоке присваивание не допускается.Имея это в виду, у кого-нибудь есть идеи, как мне это сделать?

Так, например, если тензор такой:

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.

В строке = 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]]

Iу меня правильный код в numpy ниже:

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

, но мне нужно сделать это в tenorflow, я пробовал приведенный ниже код, хотя он по-прежнему вызывает ту же ошибку:

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

Я такжеПосмотрел здесь ссылки с той же ошибкой, но они предлагают решение, точно соответствующее их кодированию, которое не соответствует моему коду.

Заранее спасибо

1 Ответ

1 голос
/ 12 июня 2019

Как говорится в сообщении об ошибке, «объект« Тензор »не поддерживает назначение элементов».Но есть как минимум один обходной путь.Один метод состоит в том, чтобы поэлементно умножить каждый элемент, который вы хотите изменить, на ноль (в исходной матрице), а затем создать новую матрицу (одинаковую форму) со всеми нулями элементов без той, которую вы хотите изменить.И тогда вы можете просто сложить их вместе, чтобы получить желаемую матрицу.

Если я правильно понимаю, что для данного конкретного случая вы правильно решите проблему, вы всегда хотите игнорировать первый столбец?Если это так, я думаю, что это тензорное решение должно работать для вас (проверено и проверено для тензорного потока версии 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...