发布时间:2024-08-05 18:01
神经网络设计过程
数据集包括鸢尾花萼长、花萼宽、花瓣长、花瓣宽以及对应的类别,鸢尾花萼长、花萼宽、花瓣长、花瓣宽作为输入特征,类别作为标签,0代表狗尾草鸢尾,1代表杂色鸢尾,2代表弗吉尼亚鸢尾.
鸢尾花神经网络简要模型如下,,所有的输入x乘以各自线上的权重w求和加上偏置b得到输出y,输入特征x的形状为1行4列,输出y的形状为1行3列,权重w的形状为4行3列,有3个偏置项。
搭建神经网络模型如下,输入特征数据,并对线上权重w和偏置b进行初始化。
输入标签为0的狗尾草鸢尾,按照的方式进行前向传播,计算过程如下。
通过输出y可以看出数值最大的时1类,而不是0类,这是由于最初参数w和b是随机产生的。
为了修正上述结果,用损失函数定义预测值和标准答案的差,当损失函数最小时,即可得到最优的w和b的值。均方误差是一种常用的损失函数,它计算了每个前向传播输出和标准答案的差求平方再除以n求平均,表征了网络前向传播推理结果和标准答案之间的差距。
为了寻找一组w和b使得损失函数最小,采用梯度下降的方法。
损失函数的梯度表示损失函数对各参数求偏导后的向量,损失函数梯度下降的方向就是损失函数减小的方向。梯度下降法就是沿着损失函数梯度下降的方向,寻找损失函数的最小值,从而得到最优的参数。
梯度下降法公式如下,lr表示学习率,是一个超参数,表征梯度下降的速度。学习率过小,参数更新很慢,学习率过大,参数可能会在最小值附近跳动。
上述梯度下降法更新参数的过程为反向传播,反向传播是从后向前,逐层求损失函数对每层神经元参数的偏导数,迭代更新所有参数。
举个例子,损失函数为loss=(w+1)^2,loss最小时,w=-1,即w=-1是最优参数w。
程序实现上述例子的参数优化过程。
当学习率为0.2时,找到了w的最优值。
import tensorflow as tf
w = tf.Variable(tf.constant(5,dtype=tf.float32)) #w的随即初始值为5
lr = 0.2 #学习率为0.2
epoch = 40 #循环迭代40次
for epoch in range(epoch): # for epoch 定义顶层循环,表示对数据集循环epoch次
with tf.GradientTape() as tape: # with结构到grads框起了梯度的计算过程。
loss = tf.square(w + 1) #损失函数为(w+1)的平方
grads = tape.gradient(loss, w) # .gradient函数告知谁对谁求导
w.assign_sub(lr * grads) # .assign_sub 对变量做自减 即 w = w - lr*grads
print(\"After %s epoch,w is %f,loss is %f\" % (epoch, w.numpy(), loss))
当学习率为0.001时,学习率过小,参数更新很慢,40轮训练无法找到最优值。
lr = 0.001 #学习率为0.001
当学习率为0.999时,学习率过大,参数在最优值两边跳动,同样无法找到最优值。
lr = 0.999 #学习率为0.999