全连接层tf.keras.layers.Dense()介绍

全连接层Dense在卷积神经网络中起到特征映射到标记空间的关键作用,将卷积后的特征图转化为一维向量。通过与权重矩阵的乘法和可能的偏置项,每个神经元的输出是所有输入值的加权和。在MNIST数字识别模型中,全连接层将Flatten后的向量进一步转换为分类输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数原型

tf.keras.layers.Dense(
    units,                                 # 正整数,输出空间的维数
    activation=None,                       # 激活函数,不指定则没有
    use_bias=True,						   # 布尔值,是否使用偏移向量
    kernel_initializer='glorot_uniform',   # 核权重矩阵的初始值设定项
    bias_initializer='zeros',              # 偏差向量的初始值设定项
    kernel_regularizer=None,               # 正则化函数应用于核权矩阵
    bias_regularizer=None,                 # 应用于偏差向量的正则化函数
    activity_regularizer=None,             # Regularizer function applied to the output of the layer (its "activation")
    kernel_constraint=None,                # Constraint function applied to the kernel weights matrix.
    bias_constraint=None, **kwargs         # Constraint function applied to the bias vector
)

官方地址:tf.keras.layers.Dense()

全连接层作用

全连接层在整个网络卷积神经网络中起到“特征提取器”的作用。如果说卷积层、池化层和激活函数等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的特征表示映射到样本的标记空间的作用。

一段来自知乎的通俗理解:

从卷积网络谈起,卷积网络在形式上有一点点像咱们正在召开的“人民代表大会”。卷积核的个数相当于候选人,图像中不同的特征会激活不同的“候选人”(卷积核)。池化层(仅指最大池化)起着类似于“合票”的作用,不同特征在对不同的“候选人”有着各自的喜好。

全连接相当于是“代表普选”。所有被各个区域选出的代表,对最终结果进行“投票”,全连接保证了receiptive field 是整个图像,既图像中各个部分(所谓所有代表),都有对最终结果影响的权利。

全连接层原理

在卷积神经网络的最后,往往会出现一两层全连接层,全连接一般会把卷积输出的二维特征图转化成一维的一个向量,这是怎么来的呢?目的何在呢?
在这里插入图片描述

最后的两列小圆球就是两个全连接层的输出,在最后一层卷积结束后,进行了最后一次池化,得到20个12*12的图像,经过全连接层变成了1*100的向量,再次经过一次全连接层变成的1*10的向量输出。

从第一步是如何到达第三步的呢,其实就是20*100个12*12的不同卷积核卷积出来的,我们也可以这样想,就是每个神经元的输出是12*12*20个输入值与对应的权值乘积的和。对于输入的每一张图,用了一个和图像一样大小的核卷积,这样整幅图就变成了一个数了,如果厚度是20就是那20个核卷积完了之后相加求和。这样就能把一张图高度浓缩成一个数了。

代码实例

这里以mnist数字识别中构建的模型为例,完整代码可看这里:【深度学习-卷积神经网络(CNN)实现mnist数字识别】

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu')) 

model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10))

model.summary()

在这里插入图片描述
经过Flatten层后得到一个1*576的向量,经过两层的全连接层后得到1*10的向量,分别对应数字1~10。

`tf.keras.layers.Dense` 和 `tf.compat.v1.layers.dense` 都是用来创建全连接层 (Dense Layer) 的API,但是它们属于TensorFlow的不同版本和模块,在使用上有一些关键的区别: ### 1. API风格不同 - **`tf.keras.layers.Dense`**: 这是TensorFlow Keras API的一部分,采用的是面向对象的设计模式。你需要先实例化一个 `Dense` 层的对象,并将其作为模型构建的一部分添加到Sequential模型或者其他类型的容器中。 ```python dense_layer = tf.keras.layers.Dense(units=64, activation='relu') model.add(dense_layer) ``` - **`tf.compat.v1.layers.dense`**: 这是在TensorFlow 1.x 中的一种函数式API调用方式,直接用于操作张量(tensor),返回一个新的经过该层处理后的张量。它是兼容性的接口之一,旨在帮助从旧版TF迁移到新版本。 ```python output_tensor = tf.compat.v1.layers.dense(input_tensor, units=64, activation=tf.nn.relu) ``` ### 2. 默认的行为差异 - 在Keras API (`tf.keras.layers.Dense`) 下,默认情况下会自动处理输入形状、权重初始化等细节;而V1版本(`tf.compat.v1.layers.dense`) 则更贴近底层,需要开发者自行管理更多的配置项如指定input_shape参数或者显式地定义变量作用域(scope)等。 ### 3. 兼容性和性能优化 - 使用最新的Keras API通常可以获得更好的集成支持以及未来版本的持续更新维护保障; - 而`compat.v1`系列是为了保持向后兼容性提供的过渡方案,适用于那些正在逐步升级其代码库但仍需保留部分老逻辑的应用场景。 综上所述,如果你刚开始学习或编写新的项目建议优先考虑使用`tf.keras.layers.Dense`这种方式更为简洁明了并且能够充分利用高层级框架带来的便利特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

K同学啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值