Изменить слои в модели Resnet - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь обучить модель resnet50 для задачи классификации изображений. Я загрузил предварительно подготовленные веса 'imagenet' перед тем, как тренировать модель на моем наборе данных. Я хочу вставить слой (средний слой вычитания) между входным слоем и первым слоем свертки.

model = ResNet50(weights='imagenet')
def mean_subtract(img):
    img = T.set_subtensor(img[:,0,:,:],img[:,0,:,:] - 123.68)
    img = T.set_subtensor(img[:,1,:,:],img[:,1,:,:] - 116.779)
    img = T.set_subtensor(img[:,2,:,:],img[:,2,:,:] - 103.939)

    return img / 255.0

Я хочу вставить inputs = Lambda(mean_subtract, name='mean_subtraction')(inputs) рядом с входным слоем и подключить его к первому слою свертки модели повторной сети без потери сохраненных весов.

Как мне это сделать?

Спасибо!

1 Ответ

0 голосов
/ 02 мая 2018

Быстрый ответ (выглядит лучше, чем добавление функции в модель)

Используйте функцию предварительной обработки, как описано здесь: предварительная обработка изображений, сгенерированных с использованием функции keras ImageDataGenerator (), для обучения модели resnet50

Длинный ответ

Поскольку ваша функция не меняет формы, вы можете поместить ее во внешнюю модель, не изменяя модель Resnet (смена моделей может быть не такой простой, я всегда стараюсь при необходимости устанавливать новые модели с деталями из других моделей).

resnet_model = ResNet50(weights='imagenet')

inputs = Input((None,None,3)) 
    #it seems you're using (3,None,None) instead.    
    #choose based on your "data_format", which by default is channels_last 

outputs = Lambda(mean_subtract,output_shape=not_necessary_with_tensorflow)(inputs)
outputs = resnet_model(outputs)

model = Model(inputs, outputs)
...