Подключение моделей Keras / замена входных данных с сохранением слоев - PullRequest
0 голосов
/ 05 мая 2018

Этот вопрос похож на Керас, заменяющий входной слой .

У меня есть сеть классификатора и сеть автоэнкодера, и я хочу использовать выходные данные автоэнкодера (т.е. кодирование + декодирование, как этап предварительной обработки) в качестве входных данных для классификатора - но после того, как классификатор уже был обучен на обычном данные.

Сеть классификации была построена с помощью функционального API, подобного этому (на основе этот пример ):

clf_input = Input(shape=(28,28,1))
clf_layer = Conv2D(...)(clf_input)
clf_layer = MaxPooling2D(...)(clf_layer)
...
clf_output = Dense(num_classes, activation='softmax')(clf_layer)
model = Model(clf_input, clf_output)
model.compile(...)
model.fit(...)

И такой автоматический кодер (на основе этот пример ):

ae_input = Input(shape=(28,28,1))
x = Conv2D(...)(ae_input)
x = MaxPooling2D(...)(x)
...
encoded = MaxPooling2D(...)(x)
x = Conv2d(...)(encoded)
x = UpSampling2D(...)(x)
...
decoded = Conv2D(...)(x)
autoencoder = Model(ae_input, decoded)
autoencoder.compile(...)
autoencoder.fit(...)

Я могу объединить две модели следующим образом (мне все еще нужны оригинальные модели, следовательно, копирование):

model_copy = keras.models.clone_model(model)
model_copy.set_weights(model.get_weights())
# remove original input layer
model_copy.layers.pop(0)
# set the new input
new_clf_output = model_copy(decoded)
# get the stacked model
stacked_model = Model(ae_input, new_clf_output)
stacked_model.compile(...)

И это прекрасно работает, когда все, что я хочу сделать, это применить модель к новым тестовым данным, но выдает ошибку примерно так:

for layer in stacked_model.layers:
    print layer.get_config()

, где он достигает конца автокодера, но затем завершается ошибкой с KeyError в точке, где модель классификатора получает свой ввод. Также при построении модели с keras.utils.plot_model я получаю это:

stacked_model

, где вы можете видеть слои автоэнкодера, но затем, в конце, вместо отдельных слоев из модели классификатора, в одном блоке есть только полная модель.

Есть ли способ соединить две модели так, чтобы новая сложенная модель фактически состояла из всех отдельных слоев?

1 Ответ

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

Хорошо, я мог бы придумать, как на самом деле вручную пройти каждый слой модели и снова подключить их один за другим, как показано ниже:

l = model.layers[1](decoded)  # layer 0 is the input layer, which we're replacing
for i in range(2, len(model.layers)):
    l = model.layers[i](l)
stacked_model = Model(ae_input, l)
stacked_model.compile(...)

, хотя это работает и дает правильный график и без ошибок, это не кажется самым элегантным решением ...

(кстати, копирование модели на самом деле кажется ненужным, поскольку я ничего не переучиваю.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...