为什么使用 tf.data 管道训练 tensorflow 模型会产生与直接使用 EagerTensors 馈送完全不同的结果?

问题描述

我正在尝试建立一个管道来训练模型。首先,我使用“训练轮”。 我将所有数据预处理为 5 个 EagerTensors——3 个用于特征,2 个用于目标。

为了便于论证,我们称特征张量“in_a,in_b,in_c”和目标张量“tgt_1,tgt_2”

输入张量的形状如下:

in_a.shape (67473,132,5)
in_b.shape (67473,132)
in_c.shape (67473,132)

目标张量是:

tgt_1.shape (67473,132)
tgt_2.shape (67473,132)

如果我使用 .fit 方法按以下方式将这些张量输入到我的模型中: training_model.fit(x=[in_a,in_c],y=[tgt_1,tgt_2],batch_size = 32,shuffle = True,epochs = 20) 我在运行拟合时 100% 得到了很好的结果(输入数据在所有情况下都相同)

然而,我的数据量超出了内存的容量,所以我很想弄清楚 tf.data.Dataset 流,这就是我遇到问题的地方。

我采用完全相同的张量并按以下方式创建压缩数据集:

feature_ds = tf.data.Dataset.from_tensor_slices((a_in,b_in,c_in))
target_ds = tf.data.Dataset.from_tensor_slices((tgt_1,tgt_2))
full_dataset = tf.data.Dataset.zip((feature_ds,target_ds)).shuffle(buffer_size=320).batch(32).prefetch(tf.data.experimental.AUTOTUNE)

这会产生以下 element_spec:

((TensorSpec(shape=(None,5),dtype=tf.float64,name=None),TensorSpec(shape=(None,132),dtype=tf.float32,name=None)),(TensorSpec(shape=(None,name=None)))

现在,当我将数据集输入到完全相同的模型中时,每次训练模型时我都会得到完全不同的结果。

training_model.fit(full_dataset,epochs = 20)

20 个 epoch 的一次拟合结果很好;再跑一次,平庸;另一个,太糟糕了。

我可能做错了什么?任何想法如何解决这个问题?我的意思是,数据源不会在提供模型的两种方式之间发生变化,而只是用于获取模型的方法。

非常感谢! 珊瑚礁

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)