【问题标题】:Unsure about Keras Functional API for fine-tuning不确定用于微调的 Keras 功能 API
【发布时间】:2023-03-15 01:35:01
【问题描述】:

我正在学习 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

输入

检索层的输入张量。

如果我只在构造函数中将模型的输入张量指定为inputsModel 类如何能够构建完整的 VGG16 模型 +headModel?

【问题讨论】:

    标签: keras deep-learning


    【解决方案1】:

    我想说的是,在实例化无头 VGG 时,会自动创建一个 Input 层,它的返回值是 baseModel.input。然后,它将所有计算跟踪到最后一个headModel,因此baseModel.inputheadModel.output 之间有一个图表。

    【讨论】:

      【解决方案2】:

      baseModel.input是VGG网络的Input层,而baseModel.output是模型输出的符号张量,所以当你在baseModel.output之上构建更多层时,你隐式连接到与 VGG 模型的计算图相同,因此 Model 类可以将最后一个 Dense 层的输出(headModel 变量)追溯到 VGG 网络的输入。

      这是在keras 跟踪用于构建模型的符号张量时在内部完成的。最后,这就是功能 API 的全部意义所在,可以轻松构建模型而不是其他预构建模型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-09
        • 1970-01-01
        相关资源
        最近更新 更多