我正在尝试了解Dataset.batch
的行为。这是我用来尝试通过基于Dataset
数组的numpy
在批处理数据上设置迭代器的代码。
## experiment with a numpy dataset
sample_size = 100000
ncols = 15
batch_size = 1000
xarr = np.ones([sample_size, ncols]) * [i for i in range(ncols)]
xarr = xarr + np.random.normal(scale = 0.5, size = xarr.shape)
yarr = np.sum(xarr, axis = 1)
self.x_placeholder = tf.placeholder(xarr.dtype, [None, ncols])
self.y_placeholder = tf.placeholder(yarr.dtype, [None, 1])
dataset = tf.data.Dataset.from_tensor_slices((self.x_placeholder, self.y_placeholder))
dataset.batch(batch_size)
self.iterator = dataset.make_initializable_iterator()
X, y = self.iterator.get_next()
但是,当我检查X和y的形状时
(Pdb) X.shape
TensorShape([Dimension(15)])
(Pdb) y.shape
TensorShape([Dimension(1)])
这使我感到困惑,因为似乎没有考虑到我的批次大小。由于我希望X和y具有两个维度,因此在构建模型时也会在下游产生问题,第一个维度是批处理中的示例数。
问题:为什么迭代器的输出是一维的?我应该如何正确地批处理?
这是我尝试过的:
shapes
函数,X
和y
的{{1}}都是相同的。batch
替换为None
)也不会改变行为。感谢建议/更正等。
答案 0 :(得分:1)
为了考虑批次大小,您需要更改以下内容
dataset.batch(batch_size)
到
dataset = dataset.batch(batch_size)