Обучение Keras MobileNetV2 на CIFAR-100 (с нуля)

Я хочу обучить MobileNetV2 с нуля на CIFAR-100 и получаю следующие результаты, когда через некоторое время он просто перестает учиться.

введите описание изображения здесь

Вот мой код. Я хотел бы, чтобы точность проверки составляла не менее 60-70%, и мне интересно, нужно ли мне предварительно обучать его на imagenet или это потому, что CIFAR100 всего лишь 32x32x3? Из-за некоторых ограничений я использую Keras 2.2.4 с tenorflow 1.12.0.

from keras.applications.mobilenet_v2 import MobileNetV2
[..]

(x_train, y_train), (x_test, y_test) = cifar100.load_data()
x_train = x_train / 255
x_test = x_test / 255
y_train = np_utils.to_categorical(y_train, 100)
y_test = np_utils.to_categorical(y_test, 100)

input_tensor = Input(shape=(32,32,3))
x = MobileNetV2(include_top=False,
                  weights=None,
                  classes=100)(input_tensor)
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu')(x)
x = Dense(512, activation='relu')(x)
preds = Dense(100, activation='softmax')(x)
model = Model(inputs=[input_tensor], outputs=[preds])

optimizer = Adam(lr=1e-3)
model.compile(loss="categorical_crossentropy",
                           optimizer=optimizer,
                           metrics=['accuracy'])

epochs = 300
batch_size = 64

callbacks = [ReduceLROnPlateau(monitor='val_loss', factor=np.sqrt(0.1), cooldown=0, patience=10, min_lr=1e-6)]
generator = ImageDataGenerator(rotation_range=15,
                                   width_shift_range=5. / 32,
                                   height_shift_range=5. / 32,
                                   horizontal_flip=True)
generator.fit(x_train)
model.fit_generator(generator.flow(x_train, y_train),
                             validation_data=(x_test, y_test),
                             steps_per_epoch=(len(x_train) // batch_size),
                             epochs=epochs, verbose=1,
                             callbacks=callbacks)

person Overholt    schedule 23.10.2019    source источник


Ответы (1)


Итак, MobileNets и все другие модели на основе Imagenet понижают дискретизацию изображения 5 раз (224 -> 7), а затем делают GlobalAveragePooling2D, а затем выходные слои.

Я думаю, что использование изображений 32 * 32 на этих моделях напрямую не даст вам хорошего результата, поскольку форма тензора будет 1 * 1 даже до GlobalAveragePooling2D.

Возможно, вам стоит попробовать изменить размер изображения так, чтобы ему понравилось 96 * 96 или удалите первый stride=2. Возьмите статью о NASNet в качестве справки, они используют 4 пула в версиях Cifar и ImageNet, в то время как только ImageNet версия имеет stride=2 в первом слое свертки.

person Natthaphon Hongcharoen    schedule 23.10.2019