Как загрузить модель keras CNN полностью связанными слоями и преобразовать ее в FCN? - PullRequest
0 голосов
/ 15 марта 2019

У меня есть модель в стиле VGG16 (т. Е. CNN с полностью связанными слоями), сохраненная в виде файла json, а веса в виде файла h5.

Я хочу загрузить эту модель и преобразовать ее в FCN (полностью сверточная модель)который может принимать изображения RGB переменного размера в качестве входных данных.

Насколько я понимаю, есть 4 основных шага: 1) Измените входной слой, чтобы принимать входные данные RGB переменного размера.2) Удалите полностью связанные слои из модели стиля VGG16 с полностью связанными слоями.3) Добавьте соответствующие сверточные слои, эквивалентные полностью соединенным слоям.4) Изменить форму и установить веса для новых слоев свертки.

Мне кажется, я знаю, как сделать шаги 2-4.Однако у меня возникают проблемы при выполнении этого шага 1.

Я прочитал сообщения типа Keras, заменяющие входной слой , но не нашел решения, которое работает для меня.

Вот что я хотел бы сделать:

#load model & weights
with open(model_json_file, 'r') as json_file:
    model_json = json_file.read()

vgg16_model = model_from_json(model_json)
vgg16_model.load_weights(model_h5_file)

#remove input layer
vgg16_model.layers.pop(0)

x = vgg16_model.get_layer('block5_pool').output
x = Conv2D(4096, (7,7), strides=1, padding='same', data_format='channels_last', activation='relu', use_bias=True)(x)
x = Conv2D(1000, (7,7), strides=1, padding='same', data_format='channels_last', activation='relu', use_bias=True)(x)
x = Conv2D(2, (7,7), strides=1, padding='same', data_format='channels_last', activation='relu', use_bias=True)(x)

new_input = Input(shape=(None,None,3), batch_shape=None, name='fcn_input')
vgg16_model.layers[0](new_input)
fcn_model_fixed_input = Model(inputs=vgg16_model.input, outputs=x)

Однако тогда:

fcn_model_fixed_input.summary()

дает:

wind_turbine_fcn_model_fixed_input.summary()

...