Python tensorflow:您的输入用完了数据

Python tensorflow:您的输入用完了数据,python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,我正在开发seq2seq keras/tensorflow 2.0模型。每次用户输入内容时,我的模型都会完美地打印响应。然而,在每个回复的最后一行,我得到了以下信息: 您:警告:tensorflow:您的输入数据不足;中断训练。确保您的数据集或生成器至少可以生成每个历元*历元的步骤打印(列车) > >打印(val_ds)批处理数据集形状:((无,224,224,3),(无),类型:(tf.float32,tf.int32)> > >打印(每个历元的列步数) > 374.0 > >打印(VA

我正在开发seq2seq keras/tensorflow 2.0模型。每次用户输入内容时,我的模型都会完美地打印响应。然而,在每个回复的最后一行,我得到了以下信息:

您:警告:tensorflow:您的输入数据不足;中断训练。确保您的数据集或生成器至少可以生成每个历元*历元的
步骤
批(在本例中为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")

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

输出:

警告:tensorflow:您的输入数据不足;中断训练。 确保您的数据集或生成器至少可以生成
steps\u per\u epoch*epoch
批次(本例中为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)
输出:


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

我还遇到过一些模型在尝试训练时出现相同警告而崩溃的情况。如果使用来自目录()的tf.keras.preprocessing.image\u dataset\u创建训练数据集,并拆分为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小时后的错误为:

纪元1/25 374/374[==========================================]-8133s 22秒/步- 损失:7.0126-精度:0.0028-val_损失:6.8585-val_精度: 0.0000e+00 Epoch 2/25 1/374[……]-预计到达时间:0s-损失:6.0445-准确度:0.0000e+00警告:tensorflow:您的输入 数据耗尽;中断训练。确保您的数据集或 生成器可以在每个历元*历元中至少生成
步骤
本例为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
>打印(列车)
> 
>打印(val_ds)批处理数据集形状:((无,224,224,3),(无),类型:(tf.float32,tf.int32)>
> 
>打印(每个历元的列步数)
> 374.0
> 
>打印(VAL_步数_/历元)
> 93.0

我在google colab中训练一个模型时也得到了这个,原因是没有足够的内存/RAM来存储每个批次的数据量(如果您使用的是批次),所以在我降低批次大小后,它会完美地运行,以确保“每个时代至少有
步骤”
批次”,将每个历元的
步数设置为

steps_per_epoch = len(X_train)//batch_size
然后,每个时代都会有足够的数据。重要的是,请记住,默认情况下,
batch_size
为32英寸


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

我也遇到了同样的问题,将验证步骤从50个减少到10个解决了这个问题。

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

例如:

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

我知道这是完全好的。首先。这是一个警告,而不是一个错误。其次,情况类似于在一个历元中训练一个数据,下一个历元训练下一个数据,并且您将历元值设置得太高,例如500(假设您的数据大小不是固定的,但大约是固定的,如果没有实际产生警告的代码,我认为这个问题没有任何意义,我看不到用户输入任何东西和使用模型的代码。啊,好的。我现在不在家,但我期待着测试。非常感谢这是错误的。它已经与内存无关。除了上面的“这是不正确的”答案之外,最好强调一下为什么会这样。当你降低批量大小时,你所做的实际上是减少了它从每个批/步骤/历元的训练集中“请求”的数据量。事实上,这确实减少了内存消耗(更少的数据,更少的内存),但这并不是由于某种内存优化才起作用的。我还可以建议在使用
tf.data.experimental.bucket\u by_sequence\u length()时设置
drop\u rements=True
validation_steps = len(X_test)//batch_size # if you have test data
dataset = tf.data.Dataset.from_tensor_slices((images, targets)) \
        .batch(12, drop_remainder=True)