如何使用预训练模型的第一层来提取Keras模型中的特征(功能性API)

时间:2019-10-19 16:53:58

标签: python tensorflow2.0 transfer-learning keras-2 pre-trained-model

我想使用预训练模型的第一层-例如在Xception中,包括add_5层以从输入中提取特征。然后将add_5层的输出传递到可训练的密集层。

我如何实现这个想法?

1 个答案:

答案 0 :(得分:1)

通常,您需要重用一个模型中的图层,将其作为输入传递到其余图层,并使用指定的组合模型的输入和输出创建Model对象。例如https://github.com/FHainzl/Visualizing_Understanding_CNN_Implementation.git中的alexnet.py。

他们有

//begining of your struct
@State var selectedOption = 1 

//something changed the selectedOption
self.selectedOption = 2

//Here your NavigationLink ( use it without button)
NavigationLink("Link Text", destination: selectedOption == 1 ? View1 : View2)

然后他们将返回的模型,所需的中间层作为模型,并返回该层的输出:

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)
…

由于highest_layer是图层(图形节点),而不是连接,返回结果(图形弧),因此您需要在return Model(inputs=self.base_model.input, outputs=my_prediction) 上添加.output

如果上部模型也准备就绪,则不确定如何正确组合模型。也许像

highest_layer