tensorflow:您的输入数据用完

Art*_*hos 19 python machine-learning deep-learning keras tensorflow

我正在研究 seq2seq keras/tensorflow 2.0 模型。每次用户输入内容时,我的模型都会完美地打印响应。但是在每个回复的最后一行我得到这个:

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

“你:”是我的最后一个输出,在用户应该输入新的东西之前。模型工作得很好,但我想没有错误是好的,但我不太明白这个错误。它说“中断训练”,但是我没有在训练任何东西,这个程序加载了一个已经训练好的模型。我想这就是错误没有停止程序的原因?

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

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")
Run Code Online (Sandbox Code Playgroud)

Nic*_*ais 12

要确保你有“至少steps_per_epoch * epochs批次”,设置steps_per_epoch

steps_per_epoch = len(X_train)//batch_size
Run Code Online (Sandbox Code Playgroud)
validation_steps = len(X_test)//batch_size # if you have test data
Run Code Online (Sandbox Code Playgroud)

然后,每个时期都会有足够的数据。重要的是,请记住,默认情况下,batch_size是 32 英寸model.fit()

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

  • 我的数据集中共有 62400 条记录,我正在尝试使用这些标志,但它给了我问题 - `--batch_size 624 \ --learning_rate 0.1 \ --steps_per_epoch 100 \ --num_epochs 1 \ --gradient_clip_norm 1.0 \ - -max_history_length 10` 我应该怎么做才能使其正常工作? (2认同)

Cil*_*hlu 6

我也遇到过许多模型在尝试训练时崩溃并出现相同的警告。训练数据集使用 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)
Run Code Online (Sandbox Code Playgroud)

但它仍然如此。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)
Run Code Online (Sandbox Code Playgroud)

处理单个成功 Epoch 3 小时后的错误为:

Epoch 1/25 374/374 [================================] - 8133s 22s/step - 损失:7.0126 - 准确度: 0.0028 - val_loss: 6.8585 - val_accuracy: 0.0000e+00 纪元 2/25 1/374 [........................................ .] - ETA:0秒 - 损失: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
Run Code Online (Sandbox Code Playgroud)

  • 您应该删除“steps_per_epoch”和“validation_steps” (4认同)

Azi*_*bro 5

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

例如:

dataset = tf.data.Dataset.from_tensor_slices((images, targets)) \
        .batch(12, drop_remainder=True)
Run Code Online (Sandbox Code Playgroud)


Vah*_*hid 1

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

x = [[test_X[0][0]], [test_X[1][0]], [test_X[2][0]]]
MODEL.predict(x)
Run Code Online (Sandbox Code Playgroud)

输出:

警告:tensorflow:您的输入数据不足;中断训练。确保您的数据集或生成器至少可以生成 steps_per_epoch * epochs批次(在本例中为 7 个批次)。构建数据集时,您可能需要使用 Repeat() 函数。

数组([[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)
Run Code Online (Sandbox Code Playgroud)

输出:

数组([[2.053718]],dtype=float32)