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