Я пытаюсь присвоить значения срезу переменной в tensorflow, но отображается следующая ошибка: "ValueError: Sliced присваивание поддерживается только для переменных". Почему эта ошибка отображается, хотя я пытаюсь сделать назначение среза переменной. Мой код выглядит примерно так:
var1 = var1[startx:endx,starty:endy].assign(tf.ones([endx-startx,endy-starty],dtype=tf.int32))
где var1
- переменная тензорного потока.
Другой ответ правильный; выполнение любой операции с переменной tf не всегда (всегда) возвращает переменную tf. Поэтому, если вы связываете назначения, используйте явные управляющие зависимости:
v = tf.Variable(...)
with tf.control_dependencies([v[...].assign(...)]):
return v[...].assign(...)
Как только var1
нарезается, он больше не является переменной.
Нотация нотации с tf.slice(tensor, a, a+b)
numpy (tensor[a:b]
) является просто сокращением длинной нотации tf.slice(tensor, a, a+b)
потока tf.slice(tensor, a, a+b)
которая выводит на график новую тензорную операцию (см. Https://www. tensorflow.org/api_docs/python/tf/slice).
График, который вы пытаетесь сделать, выглядит (с тензорными типами вывода, указанными в круглых скобках):
Var1
(tf.Variable) → tf.slice
(tf.Tensor) тензор → tf.assign
(tf.Variable).
Поскольку присваивание работает только с объектами tf.Variable
, оно не может работать на выходе фрагмента op.
tf.Variable([1., 2])[0:1].assign(tf.ones((1,)))
. Более вероятно, что var1
был нарезан раньше и что показанная операция является последующей нарезкой.
var1
? Также, пожалуйста, опубликуйте выводprint(var1); print(type(var1))
.var1
? Или хотя бы то, что воспроизводит точно такую же ошибку? Создав надлежащий минимальный воспроизводимый пример , будет гораздо легче ответить на этот вопрос.