Я пытаюсь выполнить перенос обучения / узкое место с помощью keras / tensorflow в записной книжке Google Colaboratory. Моя проблема в том, что точность не превышает 6% (испытание породы собак Kaggle, 120 классов, данные сгенерированы с помощью datagen.flow_from_directory)

Ниже мой код, что-то мне не хватает?

tr_model=ResNet50(include_top=False,
                  weights='imagenet',
                 input_shape = (224, 224, 3),)

datagen = ImageDataGenerator(rescale=1. / 255)

#### Training ####
train_generator = datagen.flow_from_directory(train_data_dir,
                                                    target_size=(image_size,image_size),
                                                    class_mode=None,
                                                    batch_size=batch_size,
                                                    shuffle=False)
bottleneck_features_train = tr_model.predict_generator(train_generator)
train_labels = to_categorical(train_generator.classes , num_classes=num_classes)

#### Validation ####
validation_generator = datagen.flow_from_directory(validation_data_dir, 
                                                    target_size=(image_size,image_size),
                                                    class_mode=None,
                                                    batch_size=batch_size,
                                                    shuffle=False)
bottleneck_features_validation = tr_model.predict_generator(validation_generator)
validation_labels = to_categorical(validation_generator.classes, num_classes=num_classes)

#### Model creation ####
model = Sequential()
model.add(Flatten(input_shape=bottleneck_features_train.shape[1:]))
model.add(Dense(num_class, activation='softmax'))

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

history = model.fit(bottleneck_features_train, train_labels,
                    epochs=30,
                    batch_size=batch_size,
                    validation_data=(bottleneck_features_validation, validation_labels))

Я получаю val_acc = 0,0592

Когда я использую ResNet50 с последним слоем, я получаю 82%.

Может ли кто-нибудь заметить, что не так с моим кодом.

1
Laurent R 10 Май 2018 в 02:05

1 ответ

Лучший ответ

Подавление масштабирования и добавление предварительной обработки очень помогли.

Эти модификации очень помогают:

from keras.applications.resnet50 import preprocess_input
datagen = ImageDataGenerator(preprocessing_function=preprocess_input)

У меня теперь точность 80%

1
Laurent R 10 Май 2018 в 17:39