Питон тензора: доступ к отдельным элементам в тензоре
Этот вопрос касается доступа к отдельным элементам в тензоре, например [[1,2,3]]. Мне нужно получить доступ к внутреннему элементу [1,2,3] (это может быть выполнено с использованием .eval() или sess.run()), но это занимает больше времени, когда размер тензора огромен)
Есть ли способ сделать то же самое быстрее?
Спасибо в Advance.
Ответы
Ответ 1
Существует два основных способа доступа к подмножествам элементов в тензоре, каждый из которых должен работать для вашего примера.
-
Используйте оператор индексирования (на основе tf.slice()
), чтобы извлечь смежный срез из тензора.
input = tf.constant([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
output = input[0, :]
print sess.run(output) # ==> [1 2 3]
Оператор индексирования поддерживает многие те же спецификации срезов, что и NumPy.
-
Используйте tf.gather()
op для выбора несмежного фрагмента из тензора.
input = tf.constant([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
output = tf.gather(input, 0)
print sess.run(output) # ==> [1 2 3]
output = tf.gather(input, [0, 2])
print sess.run(output) # ==> [[1 2 3] [7 8 9]]
Обратите внимание, что tf.gather()
позволяет вам выбирать целые фрагменты в 0-м измерении (целые строки в примере матрицы), поэтому вам может понадобиться tf.reshape()
или tf.transpose()
, чтобы получить соответствующие элементы.
Ответ 2
Вы просто не можете получить значение 0-го элемента из [[1,2,3]] без выполнения() - ning или eval() - операции, которая будет получать его. Поскольку перед запуском или "eval" у вас есть только описание того, как получить этот внутренний элемент (поскольку TF использует символические графики/вычисления). Поэтому, даже если вы будете использовать tf.gather/tf.slice, вам все равно придется получать значения этих операций через eval/run. См. Ответ @mrry.
Ответ 3
Я подозреваю, что остальная часть вычисления требует времени, а не доступа к одному элементу.
Также в результате может потребоваться копия из любой сохраненной памяти, поэтому, если она на графической карте сначала должна быть скопирована в RAM, а затем вы получите доступ к своему элементу. Если это так, вы можете пропустить его, добавив операцию тензорного потока, чтобы перенести первый элемент, и только возвращайте это.