Как использовать первые слои предварительно обученной модели для извлечения функций внутри модели Keras (Функциональный API)

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

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


person user8270077    schedule 19.10.2019    source источник


Ответы (1)


Как правило, вам необходимо повторно использовать слои из одной модели, чтобы передать их в качестве входных данных для остальных слоев и создать объект «Модель» с указанными входными и выходными данными объединенной модели. Например, 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)
person Mikhail M    schedule 20.10.2019