Я пытался сделать N-мерное обновление, используя tf.scatter_update
(после сбоя tf.scatter_nd
из-за несоответствия формы). Как правило, они будут использоваться для создания масок для фильтрации срезов входящего тензора.
Предполагается, что входной Тензор A имеет форму (партия, i, j, k (глубина)).
Меня интересует только изменение значений i, j для всех k и для всех b .
MWE:
import tensorflow as tf
b, i, j, k = 64, 128, 128, 256
A = tf.random_uniform(shape=(64, 128, 128, 256), dtype='int32', seed=1234) # Batch, i, j, k
mask = tf.ones(shape=(b,i,j,k), dtype='int32')
# Placeholder for more complicated index Tensor. GPU Ignores OOB indices.
indices = tf.random_uniform(shape=(b, 25, k, 2), dtype='int32', seed=4321) # Index number, k, i-j coord.
updates = tf.random_uniform(shape=(i, j, k), dtype='int32', seed=1111)
scatter = tf.scatter_update(mask, indices, updates)
with tf.Session() as sess:
sess.run(scatter)
В результате:
AttributeError: у объекта 'Tensor' нет атрибута '_lazy_read'
Я пробовал это через Python Script, Python Notebook и с / без Eager Execution. Не повезло.
Входные данные обязательно должны быть тензорными, поскольку идея состоит в том, чтобы редко обновлять этот тензор на полпути через серию операций.
Есть что-то фундаментальное, что я упускаю в отношении tf.scatter_update
? tf.scatter_nd
будет более подходящим? Если да, то в чем различия, особенно с индексами обновлений.
При ссылке на документацию tf.scatter_update примеры являются базовыми и используют константы; Мне трудно применить это к более реалистичной ситуации и проблеме.