tf.keras.layers.Dense函数

函数原型
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, 
					  kernel_constraint=None,
					  bias_constraint=None, 
					  **kwargs
)
函数说明

全连接层用于将一个特征空间线性变化到另一个特征空间,在整个神经网络中起到分类器的作用。
在这里插入图片描述
全连接层的每一个节点都与上一层每个节点连接,把前一层的输出特征都综合起来,因为用到了所有的局部特征,所有叫全连接。全连接层一般用于模型的最后一层,通过将样本的隐藏特征空间映射到样本标记空间,最终实现样本分类的目的。

全连接层在tensorflow里面用Dense函数来定义,实现的运算为output = activation(dot(input, kernel) + bias)。其中input为输入数据,kernel为核矩阵,由参数kernel_initializer定义,dot为两个矩阵的点积运算, bias为偏置矩阵,由参数bias_initializer定义,activation为激活函数。

参数use_bias表示是否使用偏置矩阵,默认为True。如果use_bias=False,则输出矩阵的运算结果output = activation(dot(input, kernel))

还有第一个参数units,定义了输出空间的维度。怎么理解呢?如果上一层输出形状为(None, 32),通过Dense(units=16)层后,输出形状为(None, 16);如果输出形状为(None, 32, 32),通过Dense(units=16)层后,输出形状为(None, 32, 16)。更准确的说,这个参数改变了输出空间最后一维的大小。

如果用Dense层作为第一层,需要提供一个input_shape参数来描述输入张量的形状。

函数用法

第一个例子

model = tf.keras.Sequential([
    # 输入层,输入形状为(None, 32, 64)
    tf.keras.layers.InputLayer(input_shape=(32, 64)),
    # 全连接层,输出最后一维维度为32,激活函数为relu,输出形状为(None, 32, 32)
    tf.keras.layers.Dense(32, activation="relu")
])
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 32, 32)            2080      
                                                                 
=================================================================
Total params: 2,080
Trainable params: 2,080
Non-trainable params: 0
_________________________________________________________________

第二个例子

model = tf.keras.Sequential([
    # 输入层,输入形状为(None, 32, 64)
    tf.keras.layers.InputLayer(input_shape=(32, 64)),
    # 全连接层,输出最后一维维度为32,激活函数为relu,输出形状为(None, 32, 32)
    tf.keras.layers.Dense(32, activation="relu"),
    # 展平层,降低输出维度
    tf.keras.layers.Flatten(),
    # 全连接层,激活函数为softmax,用于多分类的情形,输出形状为(None, 4)
    tf.keras.layers.Dense(4, activation="softmax")
])
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 32, 32)            2080      
                                                                 
 flatten (Flatten)           (None, 1024)              0         
                                                                 
 dense_1 (Dense)             (None, 4)                 4100      
                                                                 
=================================================================
Total params: 6,180
Trainable params: 6,180
Non-trainable params: 0
_________________________________________________________________

第三个例子

model = tf.keras.Sequential([
    # 输入层,输入形状为(None, 32, 64)
    tf.keras.Input(shape=(32, 64)),
    # 全连接层,输出最后一维维度为32,激活函数为relu,输出形状为(None, 32, 32)
    tf.keras.layers.Dense(32, activation="relu"),
    # 展平层,降低输出维度
    tf.keras.layers.Flatten(),
    # 全连接层,激活函数为relu, 输出形状为(None, 16)
    tf.keras.layers.Dense(16, activation="relu"),
    # 全连接层,激活函数为sigmoid,用于二分类的情形,输出形状为(None, 1)
    tf.keras.layers.Dense(1, activation="sigmoid")
])
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 32, 32)            2080      
                                                                 
 flatten (Flatten)           (None, 1024)              0         
                                                                 
 dense_1 (Dense)             (None, 16)                16400     
                                                                 
 dense_2 (Dense)             (None, 2)                 34        
                                                                 
=================================================================
Total params: 18,514
Trainable params: 18,514
Non-trainable params: 0
_________________________________________________________________
`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
发出的红包

打赏作者

不负韶华ღ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值