Объединение/объединение двух моделей для трансфертного обучения в KERAS

Как мы можем объединить/объединить две модели в Transfer Leaning в KERAS?

У меня есть две модели: модель 1 = моя модель, модель 2 = обученная модель.

Я могу объединить эти модели, поставив модель 2 в качестве входных данных, а затем передав ее выходные данные модели 1, что является обычным способом.

Однако я делаю это по-другому. Я хочу поместить модель 1 в качестве входных данных, а затем передать ее вывод модели 2 (т.е. обученной модели).


person Hamdard    schedule 28.08.2017    source источник


Ответы (2)


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

from keras.models import Model

output = model2(model1.outputs)
joinedModel = Model(model1.inputs,output)

Убедитесь (если вы этого хотите), чтобы все слои из модели 2 имели trainable=False перед компиляцией, поэтому обучение не изменит уже обученную модель.


Тестовый код:

from keras.layers import *
from keras.models import Sequential, Model

#creating model 1 and model 2 -- the "previously existing models"
m1 = Sequential()
m2 = Sequential()
m1.add(Dense(20,input_shape=(50,)))
m1.add(Dense(30))
m2.add(Dense(5,input_shape=(30,)))
m2.add(Dense(11))

#creating model 3, joining the models 
out2 = m2(m1.outputs)
m3 = Model(m1.inputs,out2)

#checking out the results
m3.summary()

#layers in model 3
print("\nthe main model:")
for i in m3.layers:
    print(i.name)

#layers inside the last layer of model 3
print("\ninside the submodel:")
for i in m3.layers[-1].layers:
    print(i.name)

Вывод:

Layer (type)                 Output Shape              Param #   
=================================================================
dense_21_input (InputLayer)  (None, 50)                0         
_________________________________________________________________
dense_21 (Dense)             (None, 20)                1020      
_________________________________________________________________
dense_22 (Dense)             (None, 30)                630       
_________________________________________________________________
sequential_12 (Sequential)   (None, 11)                221       
=================================================================
Total params: 1,871
Trainable params: 1,871
Non-trainable params: 0
_________________________________________________________________

the main model:
dense_21_input
dense_21
dense_22
sequential_12

inside the submodel:
dense_23
dense_24
person Daniel Möller    schedule 28.08.2017
comment
Точно так же пробовал раньше. Но он просто добавляет последний слой модели 2 в модель 1. Я опубликовал свой ответ. - person Hamdard; 29.08.2017
comment
Забудьте о последовательных моделях, это чистое ограничение. Перейдите к коду, показанному выше. - person Daniel Möller; 29.08.2017
comment
Я последовал вашему предложению с Model API. Это не сработало, и он включал только последний слой. - person Hamdard; 09.09.2017
comment
Он включает все слои. В сводке отображается имя всей модели, а не имя отдельного слоя. -- См. тестовый код. - person Daniel Möller; 09.09.2017

Проблема была решена.

Я использовал функцию model.add(), а затем добавил все необходимые слои модели 1 и модели 2.

Следующий код добавит первые 10 слоев модели 2 сразу после модели 1.

for i in model2.layers[:10]: model.add(i)

person Hamdard    schedule 28.08.2017