Я использую 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%) в течение всего обучения.