Оптимальный метод тензорного присвоения на «разреженном» тензоре для Кераса - PullRequest
1 голос
/ 29 марта 2019

Я пытаюсь создать многомерный массив размером n (где n является частью тензора символьной формы).Этот массив должен иметь 0 в каждом регионе, но немногие, где он будет переменной b_class.

Вот простая реализация Numpy этого, но в этом случае наш массив будет иметь фиксированный размер 100 вместо тензора:

import numpy as np

index_array = [10, 99, 50, 70] 
n = 100
zero_array = np.zeros(100)

for b_class in range(0, 4):
    zero_array[index_array[b_class]] = b_class  # every class position is defined by index_array

print(zero_array)

Это прекрасно работает для определенных констант, но в нашем случае n - тензор, поэтому index_array, поэтому zero_array = K.zeros((n)), где K - Keras.backend и, следовательно, присвоение значений в "Pythonic" манере приведет к ошибке:

TypeError: объект 'Tensor' не поддерживает назначение элементов в TensorFlow

Вопрос

Я хочу найти способ реплицировать код только в бэкэнде на основе Keras без использования tf.Variable и tf.SparseTensor, чтобы он был полностью совместим с Keras.

Есть ли способ выполнить простую задачу присвоения значений разреженному тензору по определенным индексам с помощью только векторизованных операций?

Спасибо!

1 Ответ

0 голосов
/ 01 апреля 2019

Да, есть.Вы можете использовать tf.scatter_nd , чтобы применить редкие обновления.Вот пример:

import tensorflow as tf

n = tf.constant([100])
index_tensor = tf.constant([[10], [99], [50], [70]])
updates = tf.range(4, dtype=tf.float32)

out = tf.scatter_nd(indices=index_tensor,
                    updates=updates,
                    shape=n)

with tf.Session() as sess:
    print(sess.run(out))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...