我正在学习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?
答案 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
,因此在headModel
至baseModel.input
之间存在一个图。
答案 1 :(得分:0)
baseModel.input
是VGG网络的Input
层,而baseModel.output
是模型输出的符号张量,因此,当您在{{1 }},您将隐式连接到VGG模型的同一计算图,因此baseModel.output
类可以将最后一个Model
层(Dense
变量)的输出追溯到VGG网络的输入。
当headModel
跟踪用于构建模型的符号张量时,此操作在内部完成。最后,这是功能性API的重点,可以轻松地在其他预先构建的模型之上构建模型。