当Variable的第一个维度为None

时间:2016-09-12 08:37:32

标签: python tensorflow machine-learning

我正在用动态形状的Tensor喂食:

x = tf.placeholder(tf.int32, shape=[None, vector_size])

我需要将其转换为shape=[1, vector_size]使用x_list = tf.unpack(x, 0)

的张量列表

但它引发了ValueError,因为第一维的长度未知,即它是None

我一直试图通过使用其他tf.placeholder来动态提供x的形状,但参数shape不能是张量。

在这种情况下如何使用tf.unpack()

或者是否还有另一个函数可以将我输入的变量转换为张量列表?

提前致谢。

2 个答案:

答案 0 :(得分:17)

我认为你不能 printf("Please input a character string, no spaces: \n\n"); scanf("%c", &c); //assigns user input to c var while ((c >= '0') && (c <= '9')) { //check char is an integer fprintf(f, "%c", &c); if (c == 0x0A) { fprintf(f, "\n\n"); fclose(f); } } 张量unpack未指明和不可推论的张量。正如他们的documentation所说:

  

如果num未指定且无法推断,则引发ValueError。

这与TensorFlow如num等操作的内部设计有关。在这个other tread中,Yaroslav Bulatov解释说

  

unpack之类的操作在图形构建时编译成“张入/张量”操作。

因此,TensorFlow需要知道unpack的特定值才能通过编译。

虽然,我试图通过使用TensorArray解决这个问题。 (请参阅以下代码进行说明)。

num

TensorArray is a class for wrapping dynamically sized arrays of Tensors。在此应用程序import tensorflow as tf import numpy as np sess = tf.InteractiveSession() # assume vector_size=2 for simplicity x = tf.placeholder(tf.int32, shape=[None, 2]) TensorArr = tf.TensorArray(tf.int32, 1, dynamic_size=True, infer_shape=False) x_array = TensorArr.unpack(x) 中初始化TensorArray对象时,请设置TensorArr = tf.TensorArray(tf.int32, 1, dynamic_size=True, infer_shape=False)dynamic_size=True,因为占位符infer_shape=False的形状仅部分定义。

访问每个未打包的元素:

x

然后在评估时间:

# access the first element
x_elem0 = x_array.read(0)
# access the last element
last_idx = tf.placeholder(tf.int32)
x_last_elem = x_array.read(last_idx)

请注意,在尝试访问每个解压缩的元素时,如果# generate random numpy array dim0 = 4 x_np = np.random.randint(0, 25, size=[dim0, 2]) print x_np # output of print x_np [[17 15] [17 19] [ 3 0] [ 4 13]] feed_dict = {x : x_np, last_idx : dim0-1} #python 0 based indexing x_elem0.eval(feed_dict=feed_dict) array([17, 15], dtype=int32) #output of x_elem0.eval(feed_dict) x_last_elem.eval(feed_dict=feed_dict) array([ 4, 13], dtype=int32) #output of x_last_elem.eval(feed_dict) sess.close() 值超出范围,您将能够通过编译,但在运行时建议索引超出范围时会出现错误。此外,解压缩张量的形状为index,因为TensorShape(None)的形状仅在被评估之前被部分确定。

答案 1 :(得分:2)

可能tf.dynamic_partition可能会有所帮助,但它需要静态数量的输出张量。如果您可以建立最大数量的张量,那么您可以使用它。

import tensorflow as tf
import numpy as np

x = tf.placeholder(tf.int32, shape=[None, 2])
data = np.random.randint(10, size=(10,2))

parts = range(len(data))
out = tf.dynamic_partition(x, parts, 20)

sess = tf.Session()
print 'out tensors:\n', out
print
print 'input data:\n', data
print
print 'sess.run result:\n', sess.run(out, {x: data})

这输出以下内容:

out tensors:
[<tf.Tensor 'DynamicPartition:0' shape=(?, 2) dtype=int32>,
 <tf.Tensor 'DynamicPartition:1' shape=(?, 2) dtype=int32>,
 <tf.Tensor 'DynamicPartition:2' shape=(?, 2) dtype=int32>,
 <tf.Tensor 'DynamicPartition:3' shape=(?, 2) dtype=int32>,
 <tf.Tensor 'DynamicPartition:4' shape=(?, 2) dtype=int32>,
 <tf.Tensor 'DynamicPartition:5' shape=(?, 2) dtype=int32>,
 <tf.Tensor 'DynamicPartition:6' shape=(?, 2) dtype=int32>,
 <tf.Tensor 'DynamicPartition:7' shape=(?, 2) dtype=int32>,
 <tf.Tensor 'DynamicPartition:8' shape=(?, 2) dtype=int32>,
 <tf.Tensor 'DynamicPartition:9' shape=(?, 2) dtype=int32>,
 <tf.Tensor 'DynamicPartition:10' shape=(?, 2) dtype=int32>,
 <tf.Tensor 'DynamicPartition:11' shape=(?, 2) dtype=int32>,
 <tf.Tensor 'DynamicPartition:12' shape=(?, 2) dtype=int32>,
 <tf.Tensor 'DynamicPartition:13' shape=(?, 2) dtype=int32>,
 <tf.Tensor 'DynamicPartition:14' shape=(?, 2) dtype=int32>,
 <tf.Tensor 'DynamicPartition:15' shape=(?, 2) dtype=int32>,
 <tf.Tensor 'DynamicPartition:16' shape=(?, 2) dtype=int32>,
 <tf.Tensor 'DynamicPartition:17' shape=(?, 2) dtype=int32>,
 <tf.Tensor 'DynamicPartition:18' shape=(?, 2) dtype=int32>,
 <tf.Tensor 'DynamicPartition:19' shape=(?, 2) dtype=int32>]
input data:
[[7 6]
 [5 1]
 [4 6]
 [4 8]
 [4 9]
 [0 9]
 [9 6]
 [7 6]
 [0 5]
 [9 7]]

sess.run result:
[array([[7, 3]], dtype=int32),
 array([[0, 5]], dtype=int32),
 array([[2, 3]], dtype=int32),
 array([[2, 6]], dtype=int32),
 array([[7, 9]], dtype=int32),
 array([[8, 2]], dtype=int32),
 array([[1, 5]], dtype=int32),
 array([[3, 7]], dtype=int32),
 array([[6, 7]], dtype=int32),
 array([[8, 1]], dtype=int32),
 array([], shape=(0, 2), dtype=int32),
 array([], shape=(0, 2), dtype=int32),
 array([], shape=(0, 2), dtype=int32),
 array([], shape=(0, 2), dtype=int32),
 array([], shape=(0, 2), dtype=int32),
 array([], shape=(0, 2), dtype=int32),
 array([], shape=(0, 2), dtype=int32),
 array([], shape=(0, 2), dtype=int32),
 array([], shape=(0, 2), dtype=int32),
 array([], shape=(0, 2), dtype=int32)]