как исправить переоснащение или где моя ошибка в моем коде - PullRequest
0 голосов
/ 21 октября 2019

Я использую предварительно обученную модель Vgg16, чтобы выполнить 100 задач классификации. Набор данных имеет крошечный образ, каждый класс содержит 500 изображений, и я случайным образом выбираю 100 классов из крошечного изображения для своих данных обучения (400) и проверки (100). Поэтому я изменяю input_shape для vgg16 для размера 32 * 32. Результаты всегда выглядят как переоснащение. Уровень подготовки высок, но val_acc всегда держится почти на 40%. Я использовал dropout, регуляризацию L2, увеличение данных ... но val_acc также застрял почти на 40%. Как я могу сделать для переоснащения или исправить мой код. Спасибо

img_width, img_height = 32, 32

epochs = 50

learning_rate = 1e-4

steps_per_epoch = 2500

train_path='./training_set_100A/'

valid_path='./testing_set_100A/'

test_path='./testing_set_100A/'

class_num = 100


train_batches = ImageDataGenerator(rescale=1. / 255
                ,rotation_range=20, zoom_range=0.15,
                width_shift_range=0.2, height_shift_range=0.2,     
shear_range=0.15,
                horizontal_flip=True, fill_mode="nearest"
                ).flow_from_directory(
                train_path, target_size=(img_width,img_height),     
batch_size=32, shuffle=True)

valid_batches = ImageDataGenerator(rescale=1. / 255).flow_from_directory(
                valid_path, target_size=(img_width,img_height),     
batch_size=10, shuffle=False)

test_batches = ImageDataGenerator(rescale=1. / 255).flow_from_directory(
test_path, target_size=    
(img_width,img_height),batch_size=10,shuffle=False)


seqmodel = Sequential()

VGG16Model = VGG16(weights='imagenet', include_top=False)

input = Input(shape=(img_width, img_height, 3), name='image_intput')

output_vgg16_conv = VGG16Model(input)

x = Flatten()(output_vgg16_conv)

x = Dense(4096, activation='relu')(x)

x = Dropout(0.5)(x)

x = Dense(4096, activation='relu')(x)

x = Dropout(0.5)(x)

x = Dense(class_num, activation='softmax')(x)

funcmodel = Model([input], [x])

funcmodel.summary()    

funcmodel.compile(optimizer=SGD(lr=learning_rate, momentum=0.9), 
loss='categorical_crossentropy', metrics=['accuracy'])

train_history = funcmodel.fit_generator(train_batches, 
steps_per_epoch=steps_per_epoch, validation_data=valid_batches, 
validation_steps=1000, epochs=epochs, verbose=1)

`

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

1) 50 эпох - это слишком много. Попробуйте запустить меньшую эпоху?

2) Проверьте точность проверки для каждой эпохи?

3) VGG слишком глубокий для ваших небольших (32 * 32) данных изображения. Попробуйте построить свою собственную сеть с меньшим количеством параметров. или попробуй ленет?

0 голосов
/ 21 октября 2019

Кажется, вы следовали примерам реализации этого с других сайтов, но вы обучаете очень маленьким образцам, чтобы обучать 2 новых плотных слоя размером 4096 каждый. Вы должны либо уменьшить размер своих слоев, либо добавить намного больше сэмплов на 20 000 вместо 500.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...