如何使用预训练模型的第一层提取 Keras 模型内的特征(功能 API)
How to use the first layers of a pretrained model to extract features inside a Keras model (Functional API)
我想使用预训练模型的第一层——比如在 Xception 中并包括 add_5 层来从输入中提取特征。然后将 add_5 层的输出传递给可训练的密集层。
我该如何实现这个想法?
通常,您需要重用一个模型中的层,将它们作为输入传递给其余层,并创建一个模型对象,其中指定了组合模型的输入和输出。例如 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
然后他们采用这个返回的模型,所需的中间层并制作一个模型 returns 该层的输出:
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)
由于highest_layer是层(图节点),不是连接,返回结果(图弧),所以需要在highest_layer
中加上.output
。
如果上面的模型也准备好了,不知道如何组合模型。也许像
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)
我想使用预训练模型的第一层——比如在 Xception 中并包括 add_5 层来从输入中提取特征。然后将 add_5 层的输出传递给可训练的密集层。
我该如何实现这个想法?
通常,您需要重用一个模型中的层,将它们作为输入传递给其余层,并创建一个模型对象,其中指定了组合模型的输入和输出。例如 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
然后他们采用这个返回的模型,所需的中间层并制作一个模型 returns 该层的输出:
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)
由于highest_layer是层(图节点),不是连接,返回结果(图弧),所以需要在highest_layer
中加上.output
。
如果上面的模型也准备好了,不知道如何组合模型。也许像
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)