Обходной путь для неспособности тензорного потока назначать в нетерпеливых тензорах - PullRequest
0 голосов
/ 21 апреля 2020

Стремительные тензоры не поддерживают назначение. Мне нужно сделать назначение.

a = tf.convert_to_tensor(np.random.choice(10, size = 12).reshape(3,4))
b = tf.convert_to_tensor(np.array([2,3]))
a[:,b] *= -1
Traceback (most recent call last):

  File "<ipython-input-15-516f7e5d5213>", line 3, in <module>
    a[:,b] *= -1

  File "/opt/anaconda3/envs/covid_timeseries/lib/python3.7/site-packages/tensorflow_core/python/ops/array_ops.py", line 777, in _slice_helper
    _check_index(s)

  File "/opt/anaconda3/envs/covid_timeseries/lib/python3.7/site-packages/tensorflow_core/python/ops/array_ops.py", line 666, in _check_index
    raise TypeError(_SLICE_TYPE_ERROR + ", got {!r}".format(idx))

TypeError: Only integers, slices (`:`), ellipsis (`...`), tf.newaxis (`None`) and scalar tf.int32/tf.int64 tensors are valid indices, got <tf.Tensor: id=3, shape=(2,), dtype=int64, numpy=array([2, 3])>

Есть предложение здесь о том, как сделать обходной путь:

new = original * mask + other * (1 - mask)

У меня проблемы с выполнением этой работы, потому что я не могу найти способ создать маску, которая сама по себе не требует назначения!

Я был бы очень признателен за некоторые рекомендации, которые помогли бы мне реализовать этот высокоуровневый подход, возможно, что-то вроде этого:

def tf_assign_workaround(tensor, index, newvals):
    ??
    return tensor_with_index_assigned_to_newvals

РЕДАКТИРОВАТЬ: Вот оригинальный, более простой пример

a = tf.convert_to_tensor(np.random.choice(10, size = 12).reshape(3,4))
a[:,1] *= -1
Traceback (most recent call last):

  File "<ipython-input-35-f8973c287624>", line 2, in <module>
    a[:,1] *= -1

TypeError: 'tensorflow.python.framework.ops.EagerTensor' object does not support item assignment

1 Ответ

1 голос
/ 22 апреля 2020

Я думаю, что вы пытаетесь сделать следующее:

>>> import numpy as np
>>> import tensorflow as tf
>>> a = tf.convert_to_tensor(np.random.choice(10, size = 12).reshape(3,4))
>>> a
<tf.Tensor: shape=(3, 4), dtype=int64, numpy=
array([[1, 1, 4, 2],
       [9, 3, 9, 1],
       [0, 9, 1, 4]])>
>>> mask = tf.convert_to_tensor(np.ones([3,4]).astype(int)*[1, 1, 0, 0])
<tf.Tensor: shape=(3, 4), dtype=int64, numpy=
array([[1, 1, 0, 0],
       [1, 1, 0, 0],
       [1, 1, 0, 0]])>
>>> a = a * mask - a * (1-mask)
>>> a
<tf.Tensor: shape=(3, 4), dtype=int64, numpy=
array([[ 1,  1, -4, -2],
       [ 9,  3, -9, -1],
       [ 0,  9, -1, -4]])>

Обратите внимание, что вы должны работать с тем же типом, поэтому маска также должна быть int64.

В случае, если вы хотите сделать его обобщенным c и изменить количество столбцов, которые хотите маскировать:

n=3
a = tf.convert_to_tensor(np.random.choice(10, size = 12).reshape(3,4))
mask = tf.convert_to_tensor(np.ones([3,4]).astype(int)*([1]*(4-n)+[0]*n))
a = a * mask - a * (1-mask)

, и вы получите последние три столбца с перевернутыми знаками:

<tf.Tensor: shape=(3, 4), dtype=int64, numpy=
array([[ 4, -1, -8, -5],
       [ 8, -6, -7, -9],
       [ 6, -3, -8, -5]])>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...