Есть тензор потока, эквивалентный np.empty? - PullRequest
0 голосов
/ 22 мая 2018

Numpy имеет эту вспомогательную функцию, np.empty , которая будет:

Возвращать новый массив заданной формы и типа без инициализации записей.

Я нахожу это весьма полезным, когда я хочу создать тензор, используя tf.concat , поскольку:

Количество измерений входных тензоров должно совпадать, и всеРазмеры, кроме оси, должны быть равны.

Так что полезно начать с пустого тензора ожидаемой формы.Есть ли способ добиться этого в тензорном потоке?

[править]

Упрощенный пример того, почему я хочу это

    netInput = np.empty([0, 4])
    netTarget = np.empty([0, 4])
    inputWidth = 2

    for step in range(data.shape.as_list()[-2]-frames_width-1):
        netInput = tf.concat([netInput, data[0, step:step + frames_width, :]], -2)
        target = tf.concat([target, data[0, step + frames_width + 1:step + frames_width + 2, :]], -2)

В этом примере, если netInput или netTargetинициализированы, я буду объединять дополнительный пример с этой инициализацией.И чтобы инициализировать их первым значением, мне нужно взломать цикл.Ничего, мэр, мне просто интересно, есть ли способ «тензорного потока», чтобы решить эту проблему.

1 Ответ

0 голосов
/ 22 мая 2018

Самое близкое, что вы можете сделать, это создать переменную, которую вы не инициализируете.Если вы используете tf.global_variables_initializer() для инициализации переменных, отключите помещение вашей переменной в список глобальных переменных во время инициализации, установив collections=[].

Например,

import numpy as np
import tensorflow as tf

x = tf.Variable(np.empty((2, 3), dtype=np.float32), collections=[])
y = tf.Variable(np.empty((2, 3), dtype=np.float32))

sess = tf.InteractiveSession()
tf.global_variables_initializer().run()

# y has been initialized with the content of "np.empty"
y.eval()
# x is not initialized, you have to do it yourself later
x.eval()

Здесь np.empty предоставляется x только для указания его формы и типа, а не для инициализации.

Теперь для таких операций, как tf.concat, вы фактически не можете (и не можете) управлять памятью самостоятельно -Вы не можете предварительно распределить вывод, как позволяют некоторые функции numpy.Tensorflow уже управляет памятью и выполняет хитрые приемы, такие как повторное использование блока памяти для вывода, если он обнаруживает, что может это сделать.

...