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()
方法,但要小心:它会无限循环(除非您指定一个数字)。
我也遇到过许多模型在尝试训练时崩溃并出现相同的警告。训练数据集使用 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)
对我有用的解决方案是drop_remainder=True
在生成数据集时进行设置。这会自动处理剩余的任何额外数据。
例如:
dataset = tf.data.Dataset.from_tensor_slices((images, targets)) \
.batch(12, drop_remainder=True)
Run Code Online (Sandbox Code Playgroud)
我在 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)
归档时间: |
|
查看次数: |
32261 次 |
最近记录: |