Каким образом я могу использовать набор изображений разных размеров в качестве входных данных для предварительно обученной модели? - PullRequest
2 голосов
/ 21 января 2020

Я работаю над рукописной проблемой распознавания di git, использующей OpenCV для предварительной обработки и Keras / Tensorflow для вывода. Я обучил модель по рукописному набору данных MNIST di git, где каждое изображение имеет размер 28x28 пикселей. Сейчас я работаю с новым набором цифр и планирую продолжить обучение с исходной архитектурой модели и перенести обучение через инициализацию веса.

Итак, вот моя проблема : я возникла проблема с потерей некоторых функций при уменьшении до 28x28 пикселей. Вот пример

enter image description here

Это должно быть два, и крошечный пробел в верхнем l oop важен, чтобы помочь дифференцировать его от 9 или 8. Но моя предварительно обработанная версия теряет пробел, поэтому l oop выглядит закрытым.

Я отправил еще один вопрос о том, как выполнить сокращение без потери функций. С другой стороны, возможно, я хотел бы уменьшить размер до большего размера, например 56x56 пикселей , где я с меньшей вероятностью потеряю такие функции. Как я могу настроить все так, чтобы этот новый размер сливался с моделью, не делая предварительно обученные веса бесполезными?

Вот определение предварительно обученной модели:

def define_model(learning_rate, momentum):
    model = Sequential()
    model.add(Conv2D(32, (3,3), activation = 'relu', kernel_initializer = 'he_uniform', input_shape=(28,28,1)))
    model.add(MaxPooling2D((2,2)))
    model.add(Conv2D(64, (3,3), activation = 'relu', kernel_initializer = 'he_uniform'))
    model.add(Conv2D(64, (3,3), activation = 'relu', kernel_initializer = 'he_uniform'))
    model.add(MaxPooling2D((2,2)))
    model.add(Flatten())
    model.add(Dense(100, activation='relu', kernel_initializer='he_uniform'))
    model.add(Dense(10, activation='softmax'))
    opt = SGD(lr=learning_rate, momentum=momentum)
    model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])
    return model

Вот одна из моих идей: увеличьте размер ядра max-pool после первого слоя так, чтобы вывод этого слоя имел ту же форму, как если бы я использовал изображения размером 28x28 пикселей. (но разве это не заставит меня потерять эту функцию в любом случае?)

Ответы [ 2 ]

2 голосов
/ 24 января 2020

Почему бы вам не повысить MNST для обучения? Ваш вопрос касается разрешения изображения, набор данных MNST создавался долгое время go, когда память графического процессора была еще очень маленькой. Все последние модели имеют размеры изображения больше 200 * 200, например, re snet использует 224*224 в качестве входной формы. Поскольку ваше изображение с самого начала уже имеет низкое разрешение, вы уменьшите масштаб, и вам будет трудно отличить модель друг от друга. Поскольку ваша модель довольно проста, я бы предложил расширить набор обучающих данных.

И да, если вы используете упомянутый вами пул, вы, вероятно, также потеряете информацию.

Надеюсь, это поможет.

0 голосов
/ 24 января 2020

Один из вариантов будет таким, как предложено выше - например, увеличить начальный набор данных с 28x28 до 56x56.

Второй вариант - добавить дополнительный слой MaxPooling или AveragePooling в начале вашего обученная модель, например:

new_input = Input(shape=(56, 56, 1), name='new_input')
x = AveragePooling2D((2,2), name='avg_pool')(new_input)
new_output = trained_model(x)
new_model = Model(new_input, new_output)

Вот краткое изложение новой модели:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
new_input (InputLayer)       (None, 56, 56, 1)         0         
_________________________________________________________________
avg_pool (AveragePooling2D)  (None, 28, 28, 1)         0         
_________________________________________________________________
trained_model (Sequential)   (None, 10)                159254    
=================================================================
Total params: 159,254
Trainable params: 159,254
Non-trainable params: 0
_________________________________________________________________
...