You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

tf.keras中Dense()双括号语法解释及预训练模型改造代码详解

tf.keras层双括号调用语法及迁移学习代码说明

双括号写法的逻辑与实现原理

你看到的tf.keras.layers.Dense(128, activation='relu')(pretrained_model.output)是Keras函数式API的标准写法,本质是两步操作合并简写:

  • 第一组括号:实例化Dense层对象。此时只定义了层的超参数(128个神经元、relu激活函数),没有绑定输入数据,也没有生成实际的权重参数。
  • 第二组括号:调用已经实例化的层对象。将预训练模型的输出张量作为输入传入该层,内部会自动完成两个操作:首先根据输入张量的维度推断当前层权重的shape并创建权重,然后执行前向传播计算,返回该层的输出张量赋值给x。

实现原理

Keras所有的层类都继承自tf.keras.layers.Layer基类,基类内置了__call__魔法方法,所以实例化后的层对象可以像普通函数一样被调用。调用过程的内部逻辑为:

  1. 检查输入张量的shape,若层还未创建权重则自动调用build()方法生成对应维度的权重
  2. 调用层的call()方法执行前向传播的计算逻辑
  3. 返回计算得到的输出张量

这种写法支持灵活搭建非顺序的网络结构(比如残差连接、多输入多输出结构),是比Sequential序列模型更通用的建模方式。

这段代码的整体功能

这是迁移学习建模的标准流程,作用是在预训练模型的基础上追加自定义分类头,适配自己的分类任务:

  1. inputs = pretrained_model.input:复用预训练模型的输入定义,无需手动声明输入的shape规则
  2. 追加自定义特征转换层:将预训练模型输出的高阶特征传入128神经元的全连接层做非线性转换
  3. 追加分类输出层:9个神经元对应9个分类类别,softmax激活输出每个类别的预测概率
  4. model = tf.keras.Model(inputs=inputs, outputs=outputs):将预训练模型和自定义的两层全连接层封装为一个独立的新模型
  5. model.compile():配置训练规则,使用Adam优化器、多分类交叉熵损失函数,训练时同步监控分类准确率指标

通常该场景下会先冻结预训练模型的所有权重,只训练新增的两个全连接层,避免破坏预训练模型已经学到的特征,待收敛后再解冻部分底层做微调进一步提升效果。


内容的提问来源于stack exchange,提问作者ANIRUDHAN K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 21:24:02