我正在用动态形状的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()
?
或者是否还有另一个函数可以将我输入的变量转换为张量列表?
提前致谢。
答案 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)]