Я обнаружил, что индексирование по-прежнему является открытой проблемой в tensorflow (# 206), поэтому мне интересно, что я могу использовать в качестве обходного пути на данный момент, Я хочу индексировать/нарезать строку/столбец матрицы на основе переменной, которая изменяется для каждого примера обучения.
Что я пробовал до сих пор:
- Нарезка на основе заполнителя (не работает)
Следующие (рабочие) фрагменты кода на основе фиксированного числа.
import tensorflow as tf
import numpy as np
x = tf.placeholder("float")
y = tf.slice(x,[0],[1])
#initialize
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
#run
result = sess.run(y, feed_dict={x:[1,2,3,4,5]})
print(result)
Однако, похоже, я не могу просто заменить одно из этих фиксированных чисел на tf.placeholder. Следующий код дает мне ошибку "TypeError: список тензоров при ожидании одиночного тензора".
import tensorflow as tf
import numpy as np
x = tf.placeholder("float")
i = tf.placeholder("int32")
y = tf.slice(x,[i],[1])
#initialize
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
#run
result = sess.run(y, feed_dict={x:[1,2,3,4,5],i:0})
print(result)
Это звучит так, как скобки вокруг [i] слишком много, но удаление их тоже не помогает. Как использовать заполнитель/переменную в качестве индекса?
- Нарезка на основе переменной python (не поддерживает backprop/update должным образом)
Я также пытался использовать обычную переменную python в качестве индекса. Это не приводит к ошибке, но сеть не учит чему-либо во время обучения. Я полагаю, потому что изменяющаяся переменная неправильно зарегистрирована, график неверен и обновления не работают?
- Нарезка через одноструй вектор + умножение (работает, но медленнее)
Один обходной путь, который я нашел, - это использование горячего вектора. Создание одноразового вектора в numpy, передавая его с помощью заполнителя, а затем выполняем разбиение по матричному умножению. Это работает, но довольно медленно.
Любые идеи, как эффективно срезать/индексировать на основе переменной?