文章目录

  • 一、张量方式实现
  • 二、层方式实现


一、张量方式实现

在 TensorFlow 中,要实现全连接层,只需要定义好权值张量W 和偏置张量b,并利用
TensorFlow 提供的批量矩阵相乘函数tf.matmul()即可完成网络层的计算。
如下代码创建输入X 矩阵为𝑏 = 2个样本,每个样本的输入特征长度为𝑑𝑖𝑛 = 784,输出节点数为𝑑𝑜𝑢𝑡 =256,故定义权值矩阵W 的shape 为[784,256],并采用正态分布初始化W;偏置向量b 的shape 定义为[256],在计算完X@W后相加即可,最终全连接层的输出O 的shape 为[2,256],即2 个样本的特征,每个特征长度为256。

x = tf.random.normal([2,784])
w1 = tf.Variable(tf.random.truncated_normal([784, 256], stddev=0.1))
b1 = tf.Variable(tf.zeros([256]))
o1 = tf.matmul(x,w1) + b1 # 线性变换
o1 = tf.nn.relu(o1) # 激活函数

二、层方式实现

全连接层本质上是矩阵的相乘相加运算,实现并不复杂。
但是作为最常用的网络层之一,TensorFlow 中有更加高层、使用更方便的层实现方式:layers.Dense(units, activation) 只需要指定输出节点数Units 和激活函数类型即可。
输入节点数将根据第一次运算时的输入shape 确定,同时根据输入、输出节点数自动创建并初始化权值矩阵W 和偏置向量b,使用非常方便。其中activation 参数指定当前层的激活函数,可以为常见的激活函数或自定义激活函数,也可以指定为None 无激活函数。

x = tf.random.normal([4,28*28])
from tensorflow.keras import layers # 导入层模块
# 创建全连接层,指定输出节点数和激活函数
fc = layers.Dense(512, activation=tf.nn.relu)
h1 = fc(x) # 通过fc 类完成一次全连接层的计算

上述通过一行代码即可以创建一层全连接层fc,并指定输出节点数为512,输入的节点数
在fc(x)计算时自动获取,并创建内部权值矩阵W 和偏置b。我们可以通过类内部的成员名
kernel 和bias 来获取权值矩阵W 和偏置b:

fc.kernel # 获取Dense 类的权值矩阵
fc.bias # 获取Dense 类的偏置向量

在优化参数时,需要获得网络的所有待优化的参数张量列表,可以通过类的
trainable_variables 来返回待优化参数列表:

fc.trainable_variables # 返回待优化参数列表

实际上,网络层除了保存了待优化张量trainable_variables,还有部分层包含了不参与梯度优化的张量,如后续介绍的BatchNormalization 层,可以通过non_trainable_variables 成员返回所有不需要优化的参数列表。
如果希望获得所有参数列表,可以通过类的variables 返回所有内部张量列表:

fc.variables # 返回所有参数列表