全连接层
1、定义
由于每个输出节点与全部的输入节点相连接,这种网络层称为全连接层(Fully-connected Layer),或者稠密连接层(Dense Layer),W 矩阵叫做全连接层的权值矩阵,𝒃向量叫做全连接层的偏置
2、实现
- 张量方式实现
在 TensorFlow 中,要实现全连接层,只需要定义好权值张量 W 和偏置张量 b,并利用TensorFlow 提供的批量矩阵相乘函数 tf.matmul()即可完成网络层的计算 - 层方式实现
TensorFlow 中有更加高层、使用更方便的层实现方式:layers.Dense(units, activation),只需要指定输出节点数 Units 和激活函数类型即可。输入节点数将根据第一次运算时的输入 shape 确定,同时根据输入、输出节点数自动创建并初始化权值矩阵 W 和偏置向量 b
通过内部的成员名kernel 和 bias 来获取权值矩阵 W 和偏置 b
x = tf.random.normal([4,3])
#导入层模块
from tensorflow.keras import layers
#指定输出的维度
net = layers.Dense(5)
out = net(x)#完成一次全连接层的计算
print("权值矩阵:",net.kernel)
print("偏置:",net.bias)
#在优化参数时,需要获得网络的所有待优化的参数张量列表,可以通过类的trainable_variables 来返回待优化参数列表
print(net.trainable_variables)
神经网络
- 张量方式实现
- 层方式实现
可以通过 Sequential 容器封装成一个网络大类对象,调用大类的前向计算函数即可完成所有层的前向计算:
x = tf.random.normal([2,3])
#通过sequential容器封装为一个网络类
model = keras.Sequential([keras.layers.Dense(2,activation="relu"),#创建隐藏层1
keras.layers.Dense(2,activation="relu"),#创建隐藏层2
keras.layers.Dense(2)#创建输出层
])
out = model(x)
print(out)
误差
利用误差反向传播算法进行反向计算的过程也叫反向传播
从另一个角度来理解神经网络,它完成的是特征的维度变换的功能。比如 4 层的MNIST 手写数字图片识别的全连接网络,它依次完成了784 → 256 → 128 → 64 → 10的特征降维过程。原始的特征通常具有较高的维度,包含了很多底层特征及无用信息,通过神经网络的层层特征变换,将较高的维度降维到较低的维度,此时的特征一般包含了与任务强相关的高层特征信息,通过对这些特征进行简单的逻辑判定即可完成特定的任务。
误差计算的几种方式:(损失函数)
均方差
MSE 误差函数的值总是大于等于 0,当 MSE 函数达到最小值 0 时,输出等于真实标签,此时神经网络的参数达到最优状态。均方差广泛应用在回归问题中,在分类问题中也可以应用均方差误差。在 TensorFlow中,可以通过函数方式或层方式实现 MSE 误差计算。
(应用见下面的代码)
keras.losses.MeanSquaredError()
交叉熵
最小化交叉熵的过程也是最大化正确类别的预测概率的过程。
激活函数及其梯度
sigmoid或者Logistic函数
tf.nn.sigmoid(XXX)
√ReLU
``
tf.nn.relu(XXXX)
`
在 ReLU(REctified Linear Unit,修正线性单元)激活函数提出之前,Sigmoid 函数通常是神经网络的激活函数首选。但是 Sigmoid 函数在输入值较大或较小时容易出现梯度值接近于 0 的现象,称为梯度弥散现象,网络参数长时间得不到更新,很难训练较深层次的网络模型。
LeakyReLU
ReLU函数在x<0时梯度恒为0,也可能造成梯度弥散现象,LeakyReLU函数表达式为:
其中𝑝为用户自行设置的某较小数值的超参数,如 0.02 等。当𝑝 = 0时,LeayReLU 函数退化为 ReLU 函数;当𝑝 ≠ 0时,𝑥 < 0能够获得较小的梯度值𝑝,从而避免出现梯度弥散现
象。
Tanh
tf.tanh(XXX)
将输入压缩到(-1,1]之间
输出层设计
除了和隐藏一样,具有维度变换、特征提取的功能,还作为输出层呢过使用,需要根据具体的任务场景来决定是否使用激活函数。常见的几种输出类型包括:
多分类问题:[0,1]区间,和为1.可以在输出层添加softmax函数实现
在 Softmax 函数的数值计算过程中,容易因输入值偏大发生数值溢出现象;在计算交
叉熵时,也会出现数值溢出的问题。为了数值计算的稳定性,TensorFlow 中提供了一个统一的接口,将 Softmax 与交叉熵损失函数同时实现,同时也处理了数值不稳定的异常,一般推荐使用,避免单独使用 Softmax 函数与交叉熵损失函数
tf.keras.losses.categorical_crossentropy(y_true, y_pred, from_logits=False)
z = tf.random.normal([2,10])#构造输出层的输出
y_onehot = tf.constant([1,3])#构造真实值
y_onehot = tf.one_hot(y_onehot,depth=10)
print(y_onehot)
#输出层未使用softmax函数,将from_logits设置为True
loss = keras.losses.categorical_crossentropy(y_onehot,z,from_logits = True)
#1、
loss = tf.reduce_mean(loss)
print(loss)
#用 losses.CategoricalCrossentropy(from_logits)类方式同时实现 Softmax 与交叉熵损失函数的计算
criteon = keras.losses.CategoricalCrossentropy(from_logits=True)
loss = criteon(y_onehot,z)
print(loss)
单输出感知机
多输出感知机