Estoy trabajando en un modelo seq2seq keras/tensorflow 2.0. Cada vez que el usuario ingresa algo, mi modelo imprime la respuesta perfectamente bien. Sin embargo, en la última línea de cada respuesta me sale esto:
Usted: ADVERTENCIA: tensorflow: su entrada se quedó sin datos; interrumpir el entrenamiento. Asegúrese de que su conjunto de datos o generador pueda generar al menos los lotes de
steps_per_epoch * epochs
(en este caso, 2 lotes). Es posible que deba usar la función repetir () al crear su conjunto de datos.
El "Tú:" es mi último resultado, antes de que se suponga que el usuario debe escribir algo nuevo. El modelo funciona totalmente bien, pero supongo que ningún error es bueno, pero no entiendo este error. Dice "interrumpiendo el entrenamiento", sin embargo, no estoy entrenando nada, este programa carga un modelo ya entrenado. Supongo que es por eso que el error no detiene el programa.
En caso de que ayude, mi modelo se ve así:
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")
Tuve el mismo problema en TF 2.1. Tiene algo que ver con la forma/tipo de la entrada, es decir, la consulta. En mi caso, resolví el problema de la siguiente manera: (Mi modelo toma 3 entradas)
x = [[test_X[0][0]], [test_X[1][0]], [test_X[2][0]]] MODEL.predict(x)
Producción:
ADVERTENCIA: tensorflow: su entrada se quedó sin datos; interrumpir el entrenamiento. Asegúrese de que su conjunto de datos o generador pueda generar al menos los lotes de
steps_per_epoch * epochs
(en este caso, 7 lotes). Es posible que deba usar la función repetir () al crear su conjunto de datos.
matriz ([[2.053718]], dtype=float32)
Solución:
x = [np.array([test_X[0][0]]), np.array([test_X[1][0]]), np.array([test_X[2][0]])] MODEL.predict(x)
Producción:
matriz ([[2.053718]], dtype=float32)
También tuve una serie de modelos que fallaron con las mismas advertencias al intentar entrenarlos. El conjunto de datos de entrenamiento se crea con tf.keras.preprocessing.image_dataset_from_directory() y se divide 80/20. He creado una variable para intentar no quedarme sin imagen. Usando ResNet50 con mis propias imágenes...
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)
pero todavía lo hace. BATCH_SIZE está configurado en 32, por lo que estoy tomando el 80% del número de imágenes y dividiéndolo por 32 y luego quitando 1 para tener un excedente... o eso pensé.
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)
El error después de 3 horas de procesar una única Época exitosa es:
Época 1/25 374/374 [==============================] - 8133s 22s/paso - pérdida: 7,0126 - precisión : 0.0028 - val_loss: 6.8585 - val_accuracy: 0.0000e+00 Época 2/25 1/374 [.................................. .] - ETA: 0s - pérdida: 6.0445 - precisión: 0.0000e+00ADVERTENCIA:tensorflow:Su entrada se quedó sin datos; interrumpir el entrenamiento. Asegúrese de que su conjunto de datos o generador pueda generar al menos los lotes de
steps_per_epoch * epochs
(en este caso, 9350.0 lotes). Es posible que deba usar la función repetir () al crear su conjunto de datos.
esto podría ayudar....
> > 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
También obtuve esto mientras entrenaba un modelo en google colab, y la razón fue que no hay suficiente memoria/RAM para almacenar la cantidad de datos por lote (si está usando un lote), así que después de bajar el tamaño del lote, todo funcionó perfectamente.
Para asegurarse de que tiene " al menos steps_per_epoch * epochs
", establezca steps_per_epoch
en
steps_per_epoch = len(X_train)//batch_size validation_steps = len(X_test)//batch_size # if you have validation data
Puede ver el número máximo de lotes que model.fit()
puede tomar en la barra de progreso cuando se interrumpe el entrenamiento:
5230/10000 [==============>...............] - ETA: 2:05:22 - loss: 0.0570
Aquí, el máximo sería 5230 - 1
Es importante tener en cuenta que, de forma predeterminada, batch_size
es 32 en model.fit()
.
Si está utilizando un tf.data.Dataset
, también puede agregar el método repeat()
, pero tenga cuidado: se repetirá indefinidamente (a menos que especifique un número).
Tuve el mismo problema y al disminuir los pasos de validación de 50 a 10 resolví el problema.
La solución que funcionó para mí fue establecer drop_remainder=True
al generar el conjunto de datos. Esto maneja automáticamente cualquier dato adicional que quede.
Por ejemplo:
dataset = tf.data.Dataset.from_tensor_slices((images, targets)) \ .batch(12, drop_remainder=True)
Entiendo que está completamente bien. En primer lugar. es una advertencia no un error. En segundo lugar, la situación es similar a que se entrena un dato durante una época, la próxima época entrena los siguientes datos y ha establecido un valor de época demasiado alto, por ejemplo, 500 (suponiendo que el tamaño de sus datos no es fijo, pero será aproximadamente <= 500). Supongamos que el tamaño de los datos es 480. Ahora, la época restante no tiene datos para procesar, de ahí la advertencia. Como resultado, vuelve al estado reciente cuando se entrenaron los últimos datos. Espero que esto ayude. Déjame saber si el concepto es mal entendido. ¡Gracias!
Intente reducir el valor de steps_per_epoch por debajo del valor que ha establecido actualmente. esto me ayudo a resolver el problema
Si crea un conjunto de datos con image_dataset_from_directory
, elimine los parámetros steps_per_epoch
y validation_steps
de model.fit
.
La razón es que los pasos se iniciaron cuando batch_size
pasó a image_dataset_from_directory
, y puede intentar obtener el número de pasos con len
.