Почему модель не учится с предварительно подготовленным vgg16 в керасе? - PullRequest
0 голосов
/ 23 апреля 2019

Я использую предварительно обученную модель VGG 16 , поставляемую с Keras, и применяю ее к набору данных SVHN , который представляет собой набор данных из 10 классов числа 0 - 10. Сеть не учится и застрял с точностью 0.17. Есть что-то, что я делаю неправильно, но я не могу это распознать. Я тренируюсь так:

import tensorflow.keras as keras

## DEFINE THE MODEL ##
vgg16 = keras.applications.vgg16.VGG16()

model = keras.Sequential()
for layer in vgg16.layers:
   model.add(layer)

model.layers.pop()

for layer in model.layers:
   layer.trainable = False

model.add(keras.layers.Dense(10, activation = "softmax"))


## START THE TRAINING ##
train_optimizer_rmsProp = keras.optimizers.RMSprop(lr=0.0001)
model.compile(loss="categorical_crossentropy", optimizer=train_optimizer_rmsProp, metrics=['accuracy'])
batch_size = 128*1

data_generator = keras.preprocessing.image.ImageDataGenerator(
    rescale = 1./255
)


train_generator = data_generator.flow_from_directory(
        'training',
        target_size=(224, 224),
        batch_size=batch_size,
        color_mode='rgb',
        class_mode='categorical'
)

validation_generator = data_generator.flow_from_directory(
        'validate',
        target_size=(224, 224),
        batch_size=batch_size,
        color_mode='rgb',
        class_mode='categorical')

history = model.fit_generator(
    train_generator, 
    validation_data = validation_generator, 
    validation_steps = math.ceil(val_split_length / batch_size),
    epochs = 15, 
    steps_per_epoch = math.ceil(num_train_samples / batch_size), 
    use_multiprocessing = True, 
    workers = 8, 
    callbacks = model_callbacks, 
    verbose = 2
)

Что я делаю не так? Есть что-то, чего мне не хватает? Я ожидал очень высокую точность, так как он несет вес от imagenet, но он застрял с точностью 0.17 с первой эпохи.

1 Ответ

0 голосов
/ 24 апреля 2019

Я предполагаю, что вы повышаете частоту дискретизации 32x32 MNIST-подобных изображений, чтобы соответствовать входу VGG16, в этом случае вам действительно нужно удалить все плотные слои, чтобы вы могли ввести любой размер изображения, как в сверточных слоях. веса не зависят от размера изображения.

Вы можете сделать это следующим образом:

vgg16 = keras.applications.vgg16.VGG16(include_top=False, input_shape=(32, 32))

То, что я считаю, должно быть поведением конструктора по умолчанию.

Когда вы производите сэмплирование изображения, в лучшем случае вы в основном размываете его, в этом случае вы должны учитывать, что один пиксель исходного изображения соответствует 7 пикселям с повышенной частотой, тогда как фильтры VGG16 имеют ширину 3 пикселя. другими словами, вы теряете функции изображения.

Нет необходимости добавлять 3 плотных слоя в конце, как в оригинальном VGG16, вы можете попробовать использовать тот же слой, что и в вашем коде.

...