Подтвердить что ты не робот

Питон тензора: доступ к отдельным элементам в тензоре

Этот вопрос касается доступа к отдельным элементам в тензоре, например [[1,2,3]]. Мне нужно получить доступ к внутреннему элементу [1,2,3] (это может быть выполнено с использованием .eval() или sess.run()), но это занимает больше времени, когда размер тензора огромен)

Есть ли способ сделать то же самое быстрее?

Спасибо в Advance.

4b9b3361

Ответ 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, а затем вы получите доступ к своему элементу. Если это так, вы можете пропустить его, добавив операцию тензорного потока, чтобы перенести первый элемент, и только возвращайте это.