keras
模型确实学习使用Numpy数组作为输入,但如果从tf.data
管道读取数据则无法取得任何进展。 可能是什么原因?
特别是,该模型消耗批量多维时间序列(因此每个点都是一个 N x M 张量)并解决分类问题。 如果通过将时间序列聚合在大型 Numpy 数组中提前准备好数据,则模型可以成功学习,准确率显着提高。 然而,当使用
tf.data
管道准备完全相同的输入数据时,准确性仍保持在基线水平。
我通过写入磁盘的方式对比了两组数据,它们是相同的。 类型也匹配。
尝试通过设置禁用线程(IIUC)
options.threading.private_threadpool_size = 1
并尝试一堆
options.experimental_optimization
选项。
是否可以从
tf.data
数据集中并行读取数据,而不是从 Numpy 数组中顺序读取数据?
为了完整起见,这是管道,其中
np_array
包含“原始”数据:
ds = tf.data.Dataset.from_tensor_slices(np_array.T)
y_ds = (
ds
.skip(T - 1)
.map(lambda s: s[-1] - 1)
.map(lambda y: to_categorical(y, 3))
)
X_ds = (
ds
.map(lambda s: s[:n_features])
.window(T, shift=1, drop_remainder=True)
.flat_map(lambda x: x.batch(T, drop_remainder=True))
.map(lambda x: tf.expand_dims(x, -1))
)
Xy_ds = (
tf.data.Dataset.zip(X_ds, y_ds)
.batch(size_batch)
.repeat(n_epochs * size_batch)
.prefetch(tf.data.AUTOTUNE)
)
以及如何调用
fit()
(steps_per_epoch
值是正确的)
model.fit(
Xy_train,
epochs=n_epochs,
steps_per_epoch=199,
verbose=2
)
问题的出现是由于处理 Numpy 数组数据时
fit()
中的隐式改组所致,而 tf.data
管道中没有这种改组。洗牌甚至适用于时间序列分析,因为数据是预先聚合的,从而保留了内部时间结构。