Я строю классификатор для набора данных Food-101 (набор изображений с 101 классом и 1 тыс. Изображений на класс). Мой подход состоял в том, чтобы использовать Keras и передавать обучение с помощью ResNet50 (веса от imagenet).
При обучении модели точность поезда умеренно улучшается в несколько эпох (30% -> 45%), но точность проверки по существу остается на уровне 0,9-1,0%. Я попытался упростить, поменять местами оптимизаторы, уменьшить и увеличить единицы измерения в скрытом слое, убрать все дополнения изображения и установить постоянное случайное начальное число на flow_from_directory()
.
Когда я смотрю на прогнозы, сделанныемодель на проверочном наборе, это всегда один и тот же класс.
Я чувствую, что модель не так уж плоха, чтобы объяснить такое отсутствие движения в точности проверки.
Будем весьма благодарны за любые предложения по повышению точности проверки.
Для справки ниже приведены соответствующие фрагменты кода:
datagen = ImageDataGenerator(rescale=1./255, validation_split=0.2)
train_datagen = datagen.flow_from_directory('data/train/', seed=42, class_mode='categorical', subset='training', target_size=(256,256))
# prints "60603 images belonging to 101 classes"
val_datagen = datagen.flow_from_directory('data/train/', seed=42, class_mode='categorical', subset='validation', target_size=(256,256))
# prints "15150 images belonging to 101 classes"
train_steps = len(train_datagen) #1894
val_steps = len(val_datagen) #474
classes = len(list(train_datagen.class_indices.keys())) #101
conv_base = ResNet50(weights='imagenet', include_top=False, pooling='avg', input_shape=(256, 256, 3))
from keras.layers import GlobalAveragePooling2D
from keras.layers import Dropout
from keras.layers import Flatten
from keras.layers import BatchNormalization
model = Sequential()
model.add(conv_base)
model.add(BatchNormalization())
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(classes, activation='softmax'))
conv_base.trainable = False
from keras.optimizers import Adam
model.compile(loss='categorical_crossentropy',
optimizer=Adam(),
metrics=['acc','top_k_categorical_accuracy'])
history = model.fit_generator(
train_datagen,
steps_per_epoch=train_steps,
epochs=5,
verbose=2,
validation_data=val_datagen,
validation_steps=val_steps
)
Вот результаты .fit_generator()
:
- Эпоха 1/5
- 724 с - потери: 3,1305 - акк: 0,3059 - top_k_categorical_accuracy: 0,5629 - val_loss: 6,5914 val_acc: 0,0099- val_top_k_categorical_accuracy: 0.0494
- Epoch 2/5
- 715s - потери: 2,4812 - соотв. 0,4021 - top_k_categorical_accuracy: 0,6785 - val_loss: 7,4093_al:0,0495
- Эпоха 3/5
- 714 с - потери: 2,3559 - в соотв. 0,4248 - top_k_categorical_accuracy: 0,7026 - val_loss: 8,9146 - val_acc: 0,0094 - val_top_k_categorical_ac5: 505 5 5*
- Эпоха 4/5
- 714 с - потери: 2,2661 - согласно: 0,4459 - top_k_categorical_accuracy: 0,7200 - val_loss: 8.0597 - val_acc: 0,0100 - val_top_k_categorical_acстоимость: 0,0494
- Эпоха 5/5
- 715s - потери: 2,1870 - согласно: 0,4583 - top_k_categorical_accuracy: 0,7348 - допустимые потери: 7,5171 - val_acc: 0,0100 - val_top_k3craccy
Вот это model.summary()
:
Layer (type) Output Shape Param #
=================================================================
resnet50 (Model) (None, 2048) 23587712
_________________________________________________________________
batch_normalization_1 (Batch (None, 2048) 8192
_________________________________________________________________
dropout_1 (Dropout) (None, 2048) 0
_________________________________________________________________
dense_1 (Dense) (None, 512) 1049088
_________________________________________________________________
dropout_2 (Dropout) (None, 512) 0
_________________________________________________________________
dense_2 (Dense) (None, 101) 51813
=================================================================
Total params: 24,696,805
Trainable params: 1,104,997
Non-trainable params: 23,591,808
_________________________________________________________________