我正在研究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")
答案 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后一切运行得很好