Невозможно понять причину «IndexError: индекс кортежа вне диапазона» при запуске fit_generator - PullRequest
0 голосов
/ 02 февраля 2019

Я создал пользовательскую модель и теперь хочу использовать ее в Google Colab с набором данных с моего диска Google (набор данных принадлежит Google Landmark Recognition Challenge в kaggle).Я использую ImageDataGenerator (flow_from_directory) и FitGenerator.

При запуске fit_generator происходит сбой на последнем шаге первой эпохи (перед проверкой).

Я свернул набор данных и модель домаксимально сократить время выполнения и проверить, не находятся ли данные в правильной форме, но они кажутся правильными

Это фактически первая модель, которую я когда-либо создавал, и я вроде как новичок в мире ML, поэтомуя думаю, что я просто что-то здесь упускаю ..

Вот мой код (без каких-либо ненужных частей)

                              rotation_range=0,
                              width_shift_range=0,
                               height_shift_range=0,
                               shear_range=0,
                               zoom_range=[0.8, 1.25],
                               horizontal_flip=True,
                               vertical_flip=False,
                               fill_mode='reflect',
                               data_format='channels_last',
                               brightness_range=[0.5, 1.5]) 

test_datagen = ImageDataGenerator(
                               rotation_range=30,
                               width_shift_range=0.1,
                               height_shift_range=0.1,
                               shear_range=0.01,
                               zoom_range=[0.8, 1.25],
                               horizontal_flip=True,
                               vertical_flip=False,
                               fill_mode='reflect',
                               data_format='channels_last',
                               brightness_range=[0.5, 1.5])

image_size = (128,128)
batch_size = 20

train_generator=train_datagen.flow_from_directory(TRAINING_DATA_DIR,
                                                 target_size=image_size,
                                                 color_mode='rgb',
                                                 batch_size=batch_size,
                                               class_mode='categorical',
                                                 shuffle=True)

validation_generator = test_datagen.flow_from_directory(
                                        VALIDATION_DATA_DIR,
                                         target_size=image_size,
                                         color_mode='rgb',
                                        class_mode = "categorical")

model = Sequential()
model.add(Conv2D(64, (3,3), input_shape = (image_size[0], image_size[1], 3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(32, (3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(150))
model.add(Activation("relu"))
model.add(Dense(100))
model.add(Activation('softmax'))

model.summary()

model.compile(loss = "categorical_crossentropy", optimizer = optimizers.SGD(lr=0.0001, momentum=0.9), metrics=["accuracy"])

// Calculate the steps sizes
step_size_train = train_generator.n//train_generator.batch_size
step_size_validation = validation_generator.n//validation_generator.batch_size

// We define an early stopper to avoid wasting compute resources and time
early = EarlyStopping(monitor='val_acc', min_delta=0, patience=2, verbose=1, mode='auto')
networkfileName = RESULTS_PATH + "/" + MODEL_NAME + "{}" + MODEL_ENDING.format(int(time.time()))          
checkpoint = ModelCheckpoint(networkfileName, monitor='val_acc', verbose=1,save_best_only=True, save_weights_only=False, mode='auto', period=1)

history = model.fit_generator(generator=train_generator,
                   steps_per_epoch=step_size_train,
                   validation_data = validation_generator,
                   validation_steps = step_size_validation,
                   epochs=5,
                   callbacks = [checkpoint, early],
                   workers=1,
                   use_multiprocessing=False,
                   verbose=1)

К сожалению, у меня нет достаточно репутации, поэтому я не могу добавить скриншот, вот ссылка: Снимок экрана исключения

Также добавлен вывод исключения здесь:

IndexError                                Traceback (most recent call last)
<ipython-input-63-db9c44988a08> in <module>()
      7                    workers=1,
      8                    use_multiprocessing=False,
----> 9                    verbose=1)

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py in fit_generator(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)
   2175         use_multiprocessing=use_multiprocessing,
   2176         shuffle=shuffle,
-> 2177         initial_epoch=initial_epoch)
   2178 
   2179   def evaluate_generator(self,

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training_generator.py in fit_generator(model, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)
    214           break
    215 
--> 216       callbacks.on_epoch_end(epoch, epoch_logs)
    217       epoch += 1
    218       if callbacks.model.stop_training:

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/callbacks.py in on_epoch_end(self, epoch, logs)
    212     logs = logs or {}
    213     for callback in self.callbacks:
--> 214       callback.on_epoch_end(epoch, logs)
    215 
    216   def on_batch_begin(self, batch, logs=None):

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/callbacks.py in on_epoch_end(self, epoch, logs)
    572     if self.epochs_since_last_save >= self.period:
    573       self.epochs_since_last_save = 0
--> 574       filepath = self.filepath.format(epoch=epoch + 1, **logs)
    575       if self.save_best_only:
    576         current = logs.get(self.monitor)

IndexError: tuple index out of range

Спасибо вам!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...