Как соединить две модели keras в одну?

Допустим, у меня есть модель ResNet50, и я хочу подключить выходной уровень этой модели к входному уровню модели VGG.

Это модель ResNet и выходной тензор ResNet50:

img_shape = (164, 164, 3)
resnet50_model = ResNet50(include_top=False, input_shape=img_shape, weights = None)

print(resnet50_model.output.shape)

Получаю вывод:

TensorShape([Dimension(None), Dimension(6), Dimension(6), Dimension(2048)])

Теперь мне нужен новый слой, на котором я изменяю этот выходной тензор на (64,64,18)

Потом у меня модель VGG16:

VGG_model = VGG_model = VGG16(include_top=False, weights=None)

Я хочу, чтобы выходные данные ResNet50 преобразовывались в желаемый тензор и подавались в качестве входных данных для модели VGG. По сути, я хочу объединить две модели. Может ли кто-нибудь помочь мне в этом? Спасибо!


person Madara    schedule 26.04.2020    source источник


Ответы (1)


Есть несколько способов сделать это. Вот один из способов использования API последовательной модели для этого.

import tensorflow as tf
from tensorflow.keras.applications import ResNet50, VGG16

model = tf.keras.Sequential()
img_shape = (164, 164, 3)
model.add(ResNet50(include_top=False, input_shape=img_shape, weights = None))

model.add(tf.keras.layers.Reshape(target_shape=(64,64,18)))
model.add(tf.keras.layers.Conv2D(3,kernel_size=(3,3),name='Conv2d'))

VGG_model = VGG16(include_top=False, weights=None)
model.add(VGG_model)

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

model.summary()

Краткое описание модели выглядит следующим образом

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
resnet50 (Model)             (None, 6, 6, 2048)        23587712  
_________________________________________________________________
reshape (Reshape)            (None, 64, 64, 18)        0         
_________________________________________________________________
Conv2d (Conv2D)              (None, 62, 62, 3)         489       
_________________________________________________________________
vgg16 (Model)                multiple                  14714688  
=================================================================
Total params: 38,302,889
Trainable params: 38,249,769
Non-trainable params: 53,120
_________________________________________________________________

Полный код находится здесь.

person Vishnuvardhan Janapati    schedule 27.04.2020
comment
Спасибо, если можно спросить, как определить, выводит ли conv2d 3 канала? Как ядра conv2d преобразуют тензоры в более чем 3 канала? - person Madara; 27.04.2020
comment
В приведенном выше примере уровень перед conv2d имеет 18 каналов (фильтров), поэтому я определил filter = 3 в conv2d, и, следовательно, было сформировано 3 канала. Вы можете изменить filters с 3 на любое число, чтобы увеличить количество каналов. - person Vishnuvardhan Janapati; 27.04.2020