Ошибка «ПРЕДУПРЕЖДЕНИЕ: tensorflow: при вводе данных не хватает», возникающая при обучении модели Keras

#python #tensorflow #keras #deep-learning

#python #tensorflow #keras #глубокое обучение

Вопрос:

Полное предупреждение: ПРЕДУПРЕЖДЕНИЕ: tensorflow: на вашем вводе закончились данные; прерывание обучения. Убедитесь, что ваш набор данных или генератор могут генерировать как минимум steps_per_epoch * epochs пакеты (в данном случае 3400 пакетов). Возможно, вам потребуется использовать функцию repeat () при создании вашего набора данных.

 # importing libraries
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras import backend as K
import tensorflow as tf

train_data_dir = 'marvel/train'
validation_data_dir = 'marvel/valid'
nb_train_samples = 2584
nb_validation_samples = 451
epochs = 100
batch_size_train = 76
batch_size_val = 41

if K.image_data_format() == 'channels_first':
    input_shape = (3, 200, 200)
else:
    input_shape = (200, 200, 3)

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(200, 200, 3)),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(8, activation='softmax')
])

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

train_datagen = ImageDataGenerator(
    rescale=1. / 255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)

test_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(train_data_dir,
                                                    target_size=(200, 200),
                                                    batch_size=batch_size_train,
                                                    classes=['black widow', 'captain america', 'doctor strange', 'hulk', 'iron man', 'loki', 'spiderman', 'thanos'],
                                                    class_mode='categorical')

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(200, 200),
    batch_size=batch_size_val, class_mode='categorical')

model.fit(train_generator,
          steps_per_epoch=nb_train_samples // batch_size_train,
          epochs=epochs, validation_data=validation_generator,
          validation_steps=nb_validation_samples // batch_size_val)

model.save_weights('characterImg.h5')
print("Saved model characterImg.h5")
 

Приведенный выше мой код. Кто-нибудь может помочь мне понять, что на самом деле означает ошибка? У меня с этим много проблем. Спасибо! (Дайте мне знать, если вам нужна дополнительная информация)

Ответ №1:

Хорошо, я не уверен, будет ли это работать для всех, но чтобы исправить это, я просто удалил строку

 steps_per_epoch=nb_train_samples // batch_size_train,
 

и это сработало. Все, что я понимаю, это не идеально, но для тех, кто ищет отчаянное решение, это может вам помочь

Ответ №2:

Похоже, что длина вашего набора данных меньше вашего nb_train_samples / nb_validation_samples .

Добавить repeat() вызов перед установкой:

 train_generator = train_generator.repeat()
validation_generator = validation_generator.repeat()
 

Комментарии:

1. Я только что попробовал это ( imgur.com/a/Xk0kjFV ) и я получил эту ошибку imgur.com/a/l3ObOeG . Спасибо за вашу помощь до сих пор