不确定是否可以微调Keras Functional API

时间:2019-11-09 16:23:22

标签: keras deep-learning

我正在学习Keras和功能性API的用法,特别是关于将预训练的VGG16模型用于另一个分类任务的知识,我遇到了这段代码:

baseModel = VGG16(weights="imagenet", include_top=False,  input_tensor=Input(shape=(224, 224, 3)))
headModel=baseModel.output
headModel=Flatten(name="flatten")(headModel)
headModel=Dense(D, activation="relu")(headModel)
headModel=Dropout(0.5)(headModel)
headModel = Dense(classes, activation="softmax")(headModel)
model = Model(inputs=baseModel.input, outputs=headModel)

最后一行,特别是baseModel.input部分让我感到困惑。在official tutorial中,inputs参数接收张量,该张量指定输入层的外观,其余outputs模型的其余部分:

from keras.models import Model
from keras.layers import Input, Dense
a = Input(shape=(32,))
b = Dense(32)(a)
model = Model(inputs=a, outputs=b)

此模型将包含给定a的b的计算所需的所有层。

但是,在前面的示例中,baseModel.input用于指定VGG16模型的整体,减去用于创建headModel的层(新部分)。从文档中,input属性是从Layer object继承的:

  

输入

     

检索图层的输入张量。

如果我仅在构造函数中将模型的输入张量指定为Model,那么inputs类将如何构建完整的VGG16模型+ headModel?

2 个答案:

答案 0 :(得分:0)

我要说的是,当实例化无头VGG时,将自动创建一个Input层,它是const files = fs.readdirSync(__dirname) files.forEach(rawName => { const routesArr = require(`./${rawName}`) //remove extension const routeName = rawName.replace(/(.*)\.[^.]+$/, '$1') module.exports[routeName] = routesArr }) 的返回值。然后,它将所有计算都跟踪到最后一个baseModel.input,因此在headModelbaseModel.input之间存在一个图。

答案 1 :(得分:0)

baseModel.input是VGG网络的Input层,而baseModel.output是模型输出的符号张量,因此,当您在{{1 }},您将隐式连接到VGG模型的同一计算图,因此baseModel.output类可以将最后一个Model层(Dense变量)的输出追溯到VGG网络的输入。

headModel跟踪用于构建模型的符号张量时,此操作在内部完成。最后,这是功能性API的重点,可以轻松地在其他预先构建的模型之上构建模型。