如何在张量流中将数据重塑为 None?

How to reshape data to None in tensorflow?

我正在使用 tensorflow 运行 队列在训练期间提供我的数据:

X, Y = tf.train.batch(
           [image, label], 
           batch_size=64 
       )

然而 X, Y 的强制形状为 [64, 32, 32,3] 和 [64, 10]。在评估期间,我想对整个测试集进行 运行 损失操作,其维度为:[10000, 32, 32, 3] 和 [10000, 10]。我会在 session.run() 中使用 feed_dict 属性 来用我的值覆盖 X、Y,但是它们的形状不兼容。

我能否以某种方式指示 tensorflow 忘记第一个维度,即重塑 [64, 32, 32, 3] -> [None, 32, 32, 3]?或者我还有其他选择可以用另一个值替换 X,Y 吗?

整个数据集足够小,可以放入内存,因此我使用与 https://github.com/tensorflow/tensorflow/blob/r0.9/tensorflow/examples/how_tos/reading_data/fully_connected_preloaded.py

中类似的方法

这有点微妙:在 TensorFlow 术语中,您实际上并不希望 reshape 张量(即更改每个维度中的元素数量),而是希望 TensorFlow "forget" 一个特定的维度,以便提供具有一定范围大小的值。

tf.placeholder_with_default() 操作旨在支持这种情况。它需要一个默认输入,在您的情况下将是下一个训练批次(形状 [64, ...]);和一个形状,在您的情况下,它与输入的形状相同,第一个维度设置为 None。然后,您可以向此占位符提供任何批量大小的值。

这是您如何使用它的示例:

X_batch, Y_batch = tf.train.batch([image, label], batch_size=64)

# Alternatively, `X_shape = [None, 32, 32, 3]`
X_shape = tf.TensorShape([None]).concatenate(X_batch.get_shape()[1:])
# Alternatively, `Y_shape = [None, 10]`
Y_shape = tf.TensorShape([None]).concatenate(Y_batch.get_shape()[1:])

# Create tensors that can be fed with a less specific shape
# than `X_batch`, `Y_batch`.
X = tf.placeholder_with_default(X_batch, shape=X_shape)
Y = tf.placeholder_with_default(Y_batch, shape=Y_shape)