是否存在等于np.empty的张量流?

时间:2018-05-22 08:25:50

标签: python numpy tensorflow empty-list

Numpy有这个辅助函数np.empty,它将:

  

返回给定形状和类型的新数组,而不初始化条目。

当我想使用tf.concat创建张量时,我发现它非常有用:

  

输入张量的尺寸必须匹配,除轴外的所有尺寸必须相等。

所以从一个预期形状的空张量开始就派上用场了。有没有办法在tensorflow中实现这个目标?

[编辑]

为什么我想要这个

的简化示例
    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'解决这个问题的方法。

3 个答案:

答案 0 :(得分:2)

您可以做的最接近的事情是创建一个不初始化的变量。如果使用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已经管理了内存并执行了智能技巧,例如,如果检测到它可以重复使用内存块,那么就可以这样做。

答案 1 :(得分:1)

在TF 2中,

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

为我工作。

答案 2 :(得分:0)

如果您要创建一个空张量,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)>