Существует ли тензорный поток, эквивалентный np.empty?

У 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, я буду объединять дополнительный пример с этой инициализацией. И чтобы инициализировать их первым значением, мне нужно взломать цикл. Ничего, мэр, мне просто интересно, есть ли способ «tensorflow» решить эту проблему.


person Andrés Marafioti    schedule 22.05.2018    source источник
comment
Нет, в TensorFlow это не имело бы смысла. Тензоры неизменяемы (кроме переменных), поэтому тензор с неопределенными значениями вряд ли будет полезен. Как вы думали использовать его с tf.concat?   -  person jdehesa    schedule 22.05.2018
comment
При подготовке данных для LSTM. Есть один вектор с примерами, и мне нужно два вектора, один для входных данных, а другой для прогнозов. Входной вектор довольно избыточен, поскольку на каждом временном шаге он содержит несколько предыдущих точек данных.   -  person Andrés Marafioti    schedule 22.05.2018


Ответы (3)


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

person P-Gn    schedule 22.05.2018
comment
Я изменил вопрос, чтобы добавить пример, чтобы уточнить, что я имел в виду. - person Andrés Marafioti; 23.05.2018
comment
Я понял, что ищу что-то другое. Ваш ответ правильный на мой вопрос, но то, что я искал, было так же просто, как использовать 0 в качестве измерения на оси. - person Andrés Marafioti; 30.05.2018

Если вы создаете пустой тензор, tf.zeros подойдет

>>> a = tf.zeros([0, 4])
>>> tf.concat([a, [[1, 2, 3, 4], [5, 6, 7, 8]]], axis=0)
<tf.Tensor: shape=(2, 4), dtype=float32, numpy=
array([[1., 2., 3., 4.],
       [5., 6., 7., 8.]], dtype=float32)>
person joel    schedule 07.08.2020

In TF 2,

tensor = tf.reshape(tf.convert_to_tensor(()), (0, n))

работал на меня.

person Sibbs Gambling    schedule 28.10.2020
comment
интересно, какая разница в использовании памяти между этим и моим ответом - person joel; 10.11.2020
comment
ты даже можешь tf.reshape((), (0, n)) - person joel; 10.11.2020