Как использовать первые слои предварительно обученной модели для извлечения объектов внутри модели Keras (Functional API) - PullRequest
1 голос
/ 19 октября 2019

Я хотел бы использовать первые слои предварительно обученной модели - скажем, в Xception up и включающий слой add_5 для извлечения объектов из входных данных. Затем передайте выходные данные слоя add_5 плотному слою, который будет обучаем.

Как я могу реализовать эту идею?

1 Ответ

0 голосов
/ 20 октября 2019

Как правило, вам нужно повторно использовать слои из одной модели, передавать их в качестве входных данных для остальных слоев и создавать объект Model с указанными входными и выходными данными комбинированной модели. Например, alexnet.py из https://github.com/FHainzl/Visualizing_Understanding_CNN_Implementation.git.

У них есть

from keras.models import Model

from keras.layers.convolutional import Conv2D, MaxPooling2D, ZeroPadding2D

def alexnet_model():
    inputs = Input(shape=(3, 227, 227))
    conv_1 = Conv2D(96, 11, strides=4, activation='relu', name='conv_1')(inputs)
    …
    prediction = Activation("softmax", name="softmax")(dense_3)
    m = Model(input=inputs, output=prediction)
    return m

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

def _sub_model(self):
    highest_layer_name = 'conv_{}'.format(self.highest_layer_num)
    highest_layer = self.base_model.get_layer(highest_layer_name)
    return Model(inputs=self.base_model.input,
                 outputs=highest_layer.output)

Вам понадобится аналогичная вещь,

highest_layer = self.base_model.get_layer('add_5')

, затем продолжите ее, как

my_dense = Dense(... name=’my_dense’)(highest_layer.output)
…

и закончите с

return Model(inputs=self.base_model.input,
             outputs=my_prediction)

Так как самый высокий слойслой (узел графа), а не соединение, возвращающее результат (дуга графа), вам нужно будет добавить .output к highest_layer.

Не уверен, как именно комбинировать модели, есливерхний тоже готов. Может быть, что-то вроде

model_2_lowest_layer = model_2.get_layer(lowest_layer_name)
upper_part_model = Model(inputs= model_2_lowest_layer.input,
                         outputs=model_2.output)
upper_part = upper_part_model()(highest_layer.output)
return Model(inputs=self.base_model.input,
             outputs=upper_part)
...