如果使用 tf.data 管道,keras 模型不会学习

问题描述 投票:0回答:1

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
)
python numpy tensorflow keras tf.data
1个回答
0
投票

问题的出现是由于处理 Numpy 数组数据时

fit()
中的隐式改组所致,而
tf.data
管道中没有这种改组。洗牌甚至适用于时间序列分析,因为数据是预先聚合的,从而保留了内部时间结构。

© www.soinside.com 2019 - 2024. All rights reserved.