Классификация изображений - Киноплакаты по жанрам. Переоснащение модели Керас - PullRequest
0 голосов
/ 08 января 2019

Пожалуйста, обратите внимание, что это проблема "Multi-Label", а не Multi-Class. Это многоуровневая, многоклассовая проблема. Я пытаюсь классифицировать постеры фильмов по жанрам, читая только изображения. Всего у меня более 22000 изображений. Я горячо закодировал жанры для модели Keas, чтобы предсказать несколько жанров для фильмов (Использовал сигмоид при окончательной активации плотного слоя). Мне нужна рекомендация для правильного размера партии и количества эпох. Я использую VGG16. Я также хотел бы знать, как выбрать, какие слои заморозить.

Я пробовал 25 эпох, используя VGG16. Модель имеет тенденцию переусердствовать, хотя. Размер партии был 10.

Вот мой подсчет тренировочных образов по жанрам (Примечание: фильм может иметь более одного жанра, что чаще всего бывает)

{'Действие': 2226,0, «Триллер»: 2788,0, «Драма»: 9283,0, «Романтика»: 2184,0, «Ужас»: 2517,0, «Фантастика»: 756,0, «Тайна»: 918,0, «Приключение»: 1105,0, «Анимация»: 583,0, «Преступление»: 1369,0, «Комедия»: 5524,0, «Фантазия»: 735,0, «Семья»: 991,0, «Музыка»: 319,0, «История»: 359,0, «Война»: 177,0, «Мюзикл»: 191,0, «Биография»: 484,0, «Спорт»: 190,0}

conv_base = VGG16(weights = 'imagenet', include_top = False, input_shape = (224,224,3))

for layer in conv_base.layers[6:]:
    layer.trainable = False

early = EarlyStopping(monitor='acc', patience=7, mode='auto')

classifier = Sequential()
classifier.add(conv_base)

from keras.layers import Dropout
classifier.add(Dense(units = 128, activation = "relu"))
classifier.add(Dropout(0.2))
classifier.add(Dense(units = 128, activation = "relu"))
classifier.add(Dropout(0.1))
classifier.add(Dense(units = 19, activation = 'sigmoid'))

classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ["accuracy"])

classifier.fit(X_train, y_train, epochs=15, batch_size=10, callbacks = [early])
...