tensorflow:您的输入数据已用完

时间:2020-01-22 16:40:42

标签: python tensorflow keras

我正在研究seq2seq keras / tensorflow 2.0模型。每次用户输入内容时,我的模型都会很好地打印响应。但是,在每个响应的最后一行,我得到以下信息:

您:警告:tensorflow:您的输入数据用完;中断训练。确保您的数据集或生成器至少可以生成steps_per_epoch * epochs个批次(在这种情况下为2个批次)。构建数据集时,可能需要使用repeat()函数。

“ You:”是我的最后一个输出,在用户应该键入新内容之前。该模型完全正常,但是我猜没有错误是好的,但是我并没有得到这个错误。它说“中断训练”,但是我没有训练任何东西,该程序加载了已经训练的模型。我想这就是为什么错误没有停止程序的原因?

如果有帮助,我的模型如下所示:

intent_model = keras.Sequential([
    keras.layers.Dense(8, input_shape=[len(train_x[0])]),  # input layer
    keras.layers.Dense(8),  # hidden layer
    keras.layers.Dense(len(train_y[0]), activation="softmax"),  # output layer
])

intent_model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"])
intent_model.fit(train_x, train_y, epochs=epochs)

test_loss, test_acc = intent_model.evaluate(train_x, train_y)
print("Tested Acc:", test_acc)

intent_model.save("models/intent_model.h5")

7 个答案:

答案 0 :(得分:2)

对我有用的解决方案是在生成数据集时设置 drop_remainder=True。这会自动处理剩余的任何额外数据。

例如:

dataset = tf.data.Dataset.from_tensor_slices((images, targets)) \
        .batch(12, drop_remainder=True)

答案 1 :(得分:1)

在尝试训练它们时,我还遇到了许多型号因相同的警告而崩溃的情况。训练数据集(如果使用tf.keras.preprocessing.image_dataset_from_directory()创建并拆分为80/20)。我创建了一个变量来尝试并且不会用完图像。将ResNet50与我自己的图像一起使用.....

TRAIN_STEPS_PER_EPOCH = np.ceil((image_count*0.8/BATCH_SIZE)-1)
# to ensure that there are enough images for training bahch
VAL_STEPS_PER_EPOCH = np.ceil((image_count*0.2/BATCH_SIZE)-1)

但它仍然可以。 BATCH_SIZE设置为32,所以我要使用图像数量的80%并除以32,然后再取下1来拥有多余的图像.....所以我认为。

history = model.fit(
        train_ds,
        steps_per_epoch=TRAIN_STEPS_PER_EPOCH,
        epochs=EPOCHS,
        verbose = 1,
        validation_data=val_ds,
        validation_steps=VAL_STEPS_PER_EPOCH,
        callbacks=tensorboard_callback)

在处理了一个成功的纪元3小时后出现的错误是:

Epoch 1/25 374/374 [=============================]-8133s 22s / step- 损失:7.0126-精度:0.0028-损耗值:6.8585-精度: 0.0000e + 00时代2/25 1/374 [.....................]-ETA:0s-损失: 6.0445-精度:0.0000e + 00警告:tensorflow:您的输入 数据用完了;中断训练。确保您的数据集或 生成器可以生成至少steps_per_epoch * epochs个批次(在 这种情况下9350.0批)。您可能需要使用repeat()函数 构建数据集时。

这可能会帮助....

> > print(train_ds) <BatchDataset shapes: ((None, 224, 224, 3), (None,)), types: (tf.float32, tf.int32)>
> 
> print(val_ds) BatchDataset shapes: ((None, 224, 224, 3), (None,)),types: (tf.float32, tf.int32)>
> 
> print(TRAIN_STEPS_PER_EPOCH)
> 374.0
> 
> print(VAL_STEPS_PER_EPOCH)
> 93.0

答案 2 :(得分:1)

要确保您具有“ 至少steps_per_epoch * epochs个批次”,请将steps_per_epoch设置为

steps_per_epoch = X_train.shape[0]//batch_size

然后,每个时期将有足够的数据。

如果您使用的是tf.data.Dataset,也可以添加repeat()方法,但是要小心:它将无限期地循环(除非您指定数字)。

答案 3 :(得分:0)

我在TF 2.1中有同样的问题。它与输入的形状/类型(即查询)有关。就我而言,我解决了以下问题:(我的模型需要3个输入)

x = [[test_X[0][0]], [test_X[1][0]], [test_X[2][0]]]
MODEL.predict(x)

输出:

警告:tensorflow:您的输入数据用完;中断训练。 确保您的数据集或生成器至少可以生成 steps_per_epoch * epochs个批次(在这种情况下为7个批次)。你可以 构建数据集时需要使用repeat()函数。

array([[2.053718]],dtype = float32)

解决方案:

x = [np.array([test_X[0][0]]), np.array([test_X[1][0]]), np.array([test_X[2][0]])]
MODEL.predict(x)

输出:

array([[2.053718]],dtype = float32)

答案 4 :(得分:0)

我遇到了同样的问题,将validation_steps从50减少到10可解决了这个问题。

答案 5 :(得分:0)

我知道这完全没问题。首先。这是警告而不是错误。其次,情况类似于在一个时期训练一个数据,下一个时期训练下一个数据并且您将时期值设置得太高,例如 500(假设您的数据大小不固定,但大约 <=500)。假设数据大小为 480。现在,剩余的 epoch 没有任何要处理的数据,因此出现警告。结果,当最后一个数据被训练时,它返回到最近的状态。 我希望这有帮助。如果这个概念被误解了,请告诉我。谢谢!

答案 6 :(得分:-2)

我在Google colab中训练模型时也遇到了这个问题,原因是没有足够的内存/ RAM来存储每个批次的数据量(如果您使用的是批次),因此在降低batch_size后一切运行得很好