Передача обучения с Keras, точность проверки не улучшается с самого начала (за пределами наивного базового уровня), в то время как точность поезда улучшается - PullRequest
0 голосов
/ 03 ноября 2019

Я строю классификатор для набора данных 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
_________________________________________________________________

1 Ответ

0 голосов
/ 03 ноября 2019

Попробуйте

1002 *
...