首页 > 解决方案 > 如何正确向 tensorflow 模型提供批处理数据集以进行拟合?

问题描述

我正在对我的数据集预处理进行一些完整性检查,然后我到达了我的模型拟合过程产生 nan 损失的地方,即,我得到了这个:

Epoch 1/20
76/76 [==============================] - 19s 205ms/step - loss: nan - mean_absolute_error: nan
Epoch 2/20
76/76 [==============================] - 16s 211ms/step - loss: nan - mean_absolute_error: nan
Epoch 3/20
76/76 [==============================] - 16s 212ms/step - loss: nan - mean_absolute_error: nan
Epoch 4/20
76/76 [==============================] - 16s 209ms/step - loss: nan - mean_absolute_error: nan
Epoch 5/20
76/76 [==============================] - 17s 219ms/step - loss: nan - mean_absolute_error: nan
... entire 20 epochs

自然,当模型被调用时,它不起作用,并且还需要意想不到的输入形状。

我的数据集具有以下形状:

<MapDataset shapes: ((None, 288, 16), (None, 3, 3)), types: (tf.float32, tf.float32)>

数据集中的每一项都是张量的元组,首先是一批输入,其次是一批对应的目标。第一个维度没有的原因是因为数据不能干净地放入批次中 - 其余部分放入不完整的批次中。

print(type(next(iter(train_dataset))))
#<class 'tuple'>
print(type(next(iter(train_dataset))[0]))
#<class 'tensorflow.python.framework.ops.EagerTensor'>
print(next(iter(train_dataset))[0])
#tf.Tensor([...],shape=(32, 288, 16), dtype=float32)
print(type(next(iter(train_dataset))[1]))
#<class 'tensorflow.python.framework.ops.EagerTensor'>
print(next(iter(train_dataset))[1])
#tf.Tensor([...],shape=(32, 3, 3), dtype=float32)

在构建数据集时,我参考了时间序列预处理源代码,并生成了具有兼容形状和类型的输出。数据集不包含任何零或 nan。我希望模型分析 288 行 16 列并吐出 3 行 3 列。很简单。我的模型是这样的:

model = tf.keras.Sequential()
model.add(tf.keras.layers.LSTM(units=50, return_sequences=True))
model.add(tf.keras.layers.Dropout(0.1))
model.add(tf.keras.layers.LSTM(units=50, return_sequences=True))
model.add(tf.keras.layers.Dropout(0.1))
model.add(tf.keras.layers.LSTM(units=50))
model.add(tf.keras.layers.Dense(units=9))
model.add(tf.keras.layers.Reshape([3,3]))

这是我提供的配件:

model.compile(loss=tf.losses.MeanSquaredError(), optimizer=tf.optimizers.Adam(clipvalue=1.0), metrics=[tf.metrics.MeanAbsoluteError()])
model.fit(train_dataset, epochs=20, validation_data=val_dataset)

据我了解,这应该有效。在调试这个东西时,我找到了关于时间序列的Tensorflow指南,据我所知,数据集结构是相同的,但是当我调用拟合时,我没有得到我习惯的结果(我'之前只做过图像分类)。

我也尝试过以 numpy 数组的形式提供训练和验证数据,但它并没有改变任何东西。我确信我的数据格式错误,因为至少应该有非常不准确的结果和大量的损失。

是否有一些我没有正确提供的东西,或者我完全缺少的东西?

标签: pythontensorflow

解决方案


推荐阅读