Пожалуйста, обратите внимание, что это проблема "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])