我正在尝试建立一个管道来训练模型。首先,我使用的是“训练轮”。我将所有数据预处理为 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_b, 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, 132, 5), dtype=tf.float64, name=None), TensorSpec(shape=(None, 132), dtype=tf.float32, name=None), TensorSpec(shape=(None, 132), dtype=tf.float32, name=None)), (TensorSpec(shape=(None, 132), dtype=tf.float32, name=None), TensorSpec(shape=(None, 132), dtype=tf.float32, name=None)))
现在,当我将数据集输入完全相同的模型时,我会得到完全不同的结果——每次训练模型时。
training_model.fit(full_dataset, epochs = 20)
一次拟合 20 个 epoch 会产生良好的结果;再跑一次,平庸;另一个,可怕的。
我可能做错了什么?任何想法如何解决这个问题?我的意思是,数据源不会在两种输入模型的方式之间发生变化,只是用于获取模型的方法。
提前谢谢了!礁石