Точность валидации (val_a cc) не меняется в течение эпох - PullRequest
3 голосов
/ 26 февраля 2020

Значение val_a cc не изменяется в течение эпох.

Резюме:

  • Я использую предварительно обученный (Imag eNet) VGG16 от Keras;

    from keras.applications import VGG16
    conv_base = VGG16(weights='imagenet', include_top=True, input_shape=(224, 224, 3))
    
  • База данных от ISBI 2016 (ISI C) - это набор из 900 изображений повреждения кожи, используемых для бинарной классификации (злокачественной или доброкачественной) для обучение и проверка, а также 379 изображений для тестирования -;

  • Я использую верхние плотные слои VGG16, кроме последнего (который классифицирует более 1000 классов), и использую двоичный вывод с сигмоидом активация функции;

    conv_base.layers.pop() # Remove last one
    conv_base.trainable = False
    model = models.Sequential()
    model.add(conv_base)
    model.add(layers.Dense(1, activation='sigmoid'))
    
  • Разблокируйте плотные слои, задавая их для обучения;

  • Получите данные, которые находятся в двух разных папках, один с именем «злокачественный», а другой «доброкачественный» в папке «обучающие данные»;

    from keras.preprocessing.image import ImageDataGenerator
    from keras import optimizers
    
    folder = 'ISBI2016_ISIC_Part3_Training_Data'
    batch_size = 20
    
    full_datagen = ImageDataGenerator(
          rescale=1./255,
          #rotation_range=40,
          width_shift_range=0.2,
          height_shift_range=0.2,
          shear_range=0.2,
          zoom_range=0.2,
          validation_split = 0.2, # 20% validation
          horizontal_flip=True)
    
    train_generator = full_datagen.flow_from_directory( # Found 721 images belonging to 2 classes.
            folder,
            target_size=(224, 224),
            batch_size=batch_size,
            subset = 'training',
            class_mode='binary')
    
    validation_generator = full_datagen.flow_from_directory( # Found 179 images belonging to 2 classes.
            folder,
            target_size=(224, 224),
            batch_size=batch_size,
            subset = 'validation',
            shuffle=False,
            class_mode='binary')
    
    model.compile(loss='binary_crossentropy',
                  optimizer=optimizers.SGD(lr=0.001), # High learning rate
                  metrics=['accuracy'])
    
    history = model.fit_generator(
           train_generator,
           steps_per_epoch=721 // batch_size+1,
           epochs=20,
           validation_data=validation_generator,
           validation_steps=180 // batch_size+1,
           )  
    
  • Затем я настраиваю его еще на 100 эпох и с более низкой скоростью обучения, установка последнего сверточного слоя на тренируемый.

Я много чего пробовал h as:

  1. Замена оптимизатора (RMSprop, Adam и SGD);
  2. Удаление верхних плотных слоев предварительно обученного VGG16 и добавление шахты;

    model.add(layers.Flatten())
    model.add(layers.Dense(128, activation='relu')) 
    model.add(layers.Dense(64, activation='relu'))
    model.add(layers.Dense(1, activation='sigmoid')) 
    
  3. Shuffle=True в validation_generator;

  4. Изменение размера пакета;

  5. Изменение скорости обучения (0.001, 0.0001, 2e-5).


Результаты аналогичны следующим:

Epoch 1/100
37/37 [==============================] - 33s 900ms/step - loss: 0.6394 - acc: 0.7857 - val_loss: 0.6343 - val_acc: 0.8101
Epoch 2/100
37/37 [==============================] - 30s 819ms/step - loss: 0.6342 - acc: 0.8107 - val_loss: 0.6342 - val_acc: 0.8101
Epoch 3/100
37/37 [==============================] - 30s 822ms/step - loss: 0.6324 - acc: 0.8188 - val_loss: 0.6341 - val_acc: 0.8101
Epoch 4/100
37/37 [==============================] - 31s 840ms/step - loss: 0.6346 - acc: 0.8080 - val_loss: 0.6341 - val_acc: 0.8101
Epoch 5/100
37/37 [==============================] - 31s 833ms/step - loss: 0.6395 - acc: 0.7843 - val_loss: 0.6341 - val_acc: 0.8101
Epoch 6/100
37/37 [==============================] - 31s 829ms/step - loss: 0.6334 - acc: 0.8134 - val_loss: 0.6340 - val_acc: 0.8101
Epoch 7/100
37/37 [==============================] - 31s 834ms/step - loss: 0.6334 - acc: 0.8134 - val_loss: 0.6340 - val_acc: 0.8101
Epoch 8/100
37/37 [==============================] - 31s 829ms/step - loss: 0.6342 - acc: 0.8093 - val_loss: 0.6339 - val_acc: 0.8101
Epoch 9/100
37/37 [==============================] - 31s 849ms/step - loss: 0.6330 - acc: 0.8147 - val_loss: 0.6339 - val_acc: 0.8101
Epoch 10/100
37/37 [==============================] - 30s 812ms/step - loss: 0.6332 - acc: 0.8134 - val_loss: 0.6338 - val_acc: 0.8101
Epoch 11/100
37/37 [==============================] - 31s 839ms/step - loss: 0.6338 - acc: 0.8107 - val_loss: 0.6338 - val_acc: 0.8101
Epoch 12/100
37/37 [==============================] - 30s 807ms/step - loss: 0.6334 - acc: 0.8120 - val_loss: 0.6337 - val_acc: 0.8101
Epoch 13/100
37/37 [==============================] - 32s 852ms/step - loss: 0.6334 - acc: 0.8120 - val_loss: 0.6337 - val_acc: 0.8101
Epoch 14/100
37/37 [==============================] - 31s 826ms/step - loss: 0.6330 - acc: 0.8134 - val_loss: 0.6336 - val_acc: 0.8101
Epoch 15/100
37/37 [==============================] - 32s 854ms/step - loss: 0.6335 - acc: 0.8107 - val_loss: 0.6336 - val_acc: 0.8101

И идет по тому же принципу с постоянной val_acc = 0.8101 .

Когда я использую набор тестов после окончания тренировки, матрица путаницы дает мне 100% правильное значение при доброкачественных поражениях (304) и 0% при злокачественных, например:

    Confusion Matrix
    [[304   0]
     [ 75   0]]

Что могу ли я поступать неправильно?

Спасибо.

1 Ответ

1 голос
/ 26 февраля 2020

VGG16 прошел обучение по RGB-центрированным данным. Однако ваш ImageDataGenerator не включает featurewise_center, поэтому вы загружаете net необработанными данными RGB. Сверточная база VGG не может обработать это, чтобы предоставить какую-либо значимую информацию, поэтому ваш net в конечном итоге всецело угадывает более распространенный класс.

В общем, когда вы видите этот тип проблемы (ваш net исключительно в предположении наиболее распространенного класса), это означает, что что-то не так с вашими данными, а не с net. Это может быть вызвано таким этапом предварительной обработки или значительной частью «отравленных» аномальных данных тренировки, которые активно наносят вред процессу обучения.

...