Как правильно использовать tf.scatter_update для N-мерного обновления? - PullRequest
0 голосов
/ 08 января 2019

Я пытался сделать 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 примеры являются базовыми и используют константы; Мне трудно применить это к более реалистичной ситуации и проблеме.

1 Ответ

0 голосов
/ 15 января 2019

В документации Tensorflow используются все операции scatter (например, scatter_nd_add и т. Д.) Путем ввода аргументов ref в качестве tf.Variable :

ref: Изменчивый Тензор. Должен быть одного из следующих типов: блаблабла. Изменчивый Тензор. Должен быть из узла Variable .

У меня была та же проблема, и она отлично работает при использовании переменной tf для ref . Все остальные аргументы могут остаться такими, какими они являются, я думаю, но я не провел тщательного расследования.

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