Keras VGG16 с каталогом flow_from_dal_valc не растет - PullRequest
0 голосов
/ 26 мая 2019

Я использую keras и импортирую сеть VGG16 с весами imagenet для классификации фотографий мужчин и женщин.

Структура каталогов:

  • split_1 / train / male / *. Jpg
  • split_1 / поезд / женщина / *. Jpg
  • split_1 / val / женщина / *. Jpg
  • split_1 / val / мужчина / *. Jpg

Я испробовал большинство решений, которые нашел через Интернет, но ни одно из них не сработало:

  • изменение batch_size
  • изменение оптимизаторов
  • изменение class_mode / функция потерь
  • установка каждого слоя на trainable
  • копирование каждого слоя из VGG в мой последовательный
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dropout, Flatten, Dense
from keras import applications

[...]

img_width, img_height = 224, 224

top_model_weights_path = "%s_retry2.h5" % split
train_data_dir = "%s/train" % split
validation_data_dir = "%s/val" % split
batch_size = 48
nb_train_samples = 4000
nb_validation_samples = ( 299 // batch_size ) * batch_size
epochs = 5

def train_top_model():
    datagen = ImageDataGenerator(
        horizontal_flip=True,
        shear_range=0.2,
        rescale=1. / 255)

    vdatagen = ImageDataGenerator(rescale=1./255)

    traingen = datagen.flow_from_directory(
        train_data_dir,
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode='categorical',
        follow_links=True,
        shuffle=True)

     valgen = vdatagen.flow_from_directory(
        validation_data_dir,
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode='categorical',
        follow_links=True,
        shuffle=True)

    vgg_model = applications.VGG16(input_shape=(224,224,3), weights="imagenet", include_top=False)
    model = Sequential()
    model.add(vgg_model)
    model.add(Flatten())
    model.add(Dense(2, activation='softmax'))
    model.compile(optimizer="rmsprop", loss='categorical_crossentropy', metrics=['accuracy'])

    history = model.fit_generator(traingen,
              epochs=epochs,
              steps_per_epoch=nb_train_samples // batch_size,
              validation_data=valgen,
              validation_steps=nb_validation_samples // batch_size)

Сообщает фактическое количество изображений так,он находит jpgs правильно.Точность в val остается «случайной» и одинаковой (~ 50%) в течение всего обучения.

Ответы [ 2 ]

1 голос
/ 26 мая 2019

Попробуйте уменьшить скорость обучения, это может быть в том случае, если ваша модель каждый раз пересекает минимумы и, следовательно, не может сходиться.

Если какая-либо настройка гиперпараметров не работает, вам нужно исправить свои данные, но я думаю, что данные классификации для мужчин и женщин не должны быть такими сложными для изучения для модели CNN с предварительно обученными весами.

0 голосов
/ 26 мая 2019

Сколько образцов у вас на класс ??? Кажется, у вас недостаточно данных для точной настройки этих масштабных параметров, которые есть у VGG16. (138 миллионов, если вы тренируете все слои)

Я предлагаю: 1. для проблемы классификации пола, попробуйте использовать официальный набор данных, такой как IMDB-WIKI 2. Если вы хотите использовать свои собственные данные, сначала соберите больше образцов меток, а затем увеличьте их все 3. наконец, используйте самые современные архитектуры CNN, такие как Xception (вы можете загрузить предварительную трассировку imagenet для xception в кератах), заморозить 20 первых слоев и настроить другие

...