应用神经网络的基本过程
神经网络搭建和使用基本过程如下:
准备数据:采集大量“特征/标签”数据(使用神经网络之前需要准备的数据)
搭建网络:搭建神经网络结构
优化参数:训练网络获取最佳参数(反转)
应用网络:将网络保存为模型,输入新数据,输出分类或预测结果(前传)(神经网络已经搭建好了,可以应用了)
其中,对于神经网络的设计过程最关键的就是搭建网络和优化参数,后续对神经网络的设计过程将以这两步骤为主。
神经网络设计过程
鸢尾花的分类过程:
将特征 [花萼长、花萼宽、花瓣长、花瓣宽] 输入神经网络,输出每个种类的可能性大小(分类的百分比)
其中神经网络里的每个小球,就是神经元
1943年,英国心里学家麦卡洛克和数据加皮茨,给出了神经元的计算模型(MP模型)
去掉非线性函数,简化的MP模型如下:
因此,y=x*w+b,就是神经网络的传播形式,其中
x为输入:[花萼长、花萼宽、花瓣长、花瓣宽] 1x4的数据
y为输出:[狗尾草鸢尾、杂色鸢尾、佛吉尼亚鸢尾] 1x3的数据
w为权重:4x3的数据
b为偏置项
(1)搭建网络
首先:初始化随机生成w与b
w:
-0.8 | -0.34 | -1.4 |
0.6 | 1.3 | 0.25 |
0.5 | 1.45 | 0.9 |
0.65 | 0.7 | -1.2 |
b:
2.52 | -3.1 | 5.62 |
(2)优化参数
目前基本上已经搭建好了神经网络,后续开始通过“特征/标签”的数据开始训练网络
输入一组数据:
特征:[花萼长、花萼宽、花瓣长、花瓣宽]=[5.8,4.0,1.2,0.2],即x=[5.8,4.0,1.2,0.2]
标签:0 狗尾草鸢尾
将特征输入到建好的神经网络里,按照传播形式y=x*w+b,通过计算得到:y=[1.01,2.01,-0.66]
这个过程称为前向传播
从输出结果里y=[1.01,2.01,-0.66]来看,最大可能性是1 杂色鸢尾 而不是标签0 狗尾草鸢尾
原因就是最初的参数W和b是随机生成的,也就是说目前的结果是蒙的
损失函数(loss function):预测值(y)与标准答案(y_)的差距
损失函数可以定量判断W和b的优势,当损失函数输出最小时,参数W、b会出现最优值
常用的损失函数,均方误差:
目的:找到一组参数W和b,使得随时函数最小
梯度:函数对个参数求偏导后的向量
函数梯度下降方向就是函数减小的方向
梯度下降法(Gradient descent):沿损失函数梯度下降的方向,寻找损失函数的最小值,得到最优参数的方法
学习率(learning rate,lr):当学习率设置的过小时,收敛过程将变得十分缓慢,而当学习率设置过大时,梯度可能会在最小值附近来回震荡,甚至无法收敛。
反向传播:从前向后,逐层求损失函数对每层神经元参数的偏导数,迭代更新左右参数
eg:损失函数
,
参数w随机初始化为5,学习率(超参数)为0.2,则
1次 w=5 5-0.2*(2*5+2)=2.6
2次 w=2.6 2.6-0.2*(2*2.6+2)=1.16
3次 w=1.16 1.16-0.2*(2*1.16+2)=0.296
4次 w=0.296
......依次进行反向传播,可以找到当w=-1时,损失函数最小,则w=-1就是参数最优值
(3)案例
在pycharm里输入如下代码(其中tensorflow版本为2.0以上)
初始设定w为0.5,学习率lr为0.2,迭代次数epoch为40,最后打印出损失函数的结果
import tensorflow as tf
w = tf.Variable(tf.constant(5, dtype=tf.float32))
lr = 0.2
epoch = 40
for epoch in range(epoch): # for epoch 定义顶层循环,表示对数据集循环epoch次,此例数据集数据仅有1个w,初始化时候constant赋值为5,循环100次迭代。
with tf.GradientTape() as tape: # with结构到grads框起了梯度的计算过程。
loss = tf.square(w + 1)
grads = tape.gradient(loss, w) # .gradient函数告知谁对谁求导
w.assign_sub(lr * grads) # .assign_sub 对变量做自减 即:w -= lr*grads 即 w = w - lr*grads
print("After %s epoch,w is %f,loss is %f" % (epoch, w.numpy(), loss))
# lr初始值:0.2 请自改学习率 0.001 0.999 看收敛过程
# 最终目的:找到 loss 最小 即 w = -1 的最优参数w
从20次左右可以看出w基本上接近-1,损失函数基本上为0
After 0 epoch,w is 2.600000,loss is 36.000000
After 1 epoch,w is 1.160000,loss is 12.959999
After 2 epoch,w is 0.296000,loss is 4.665599
After 3 epoch,w is -0.222400,loss is 1.679616
After 4 epoch,w is -0.533440,loss is 0.604662
After 5 epoch,w is -0.720064,loss is 0.217678
After 6 epoch,w is -0.832038,loss is 0.078364
After 7 epoch,w is -0.899223,loss is 0.028211
After 8 epoch,w is -0.939534,loss is 0.010156
After 9 epoch,w is -0.963720,loss is 0.003656
After 10 epoch,w is -0.978232,loss is 0.001316
After 11 epoch,w is -0.986939,loss is 0.000474
After 12 epoch,w is -0.992164,loss is 0.000171
After 13 epoch,w is -0.995298,loss is 0.000061
After 14 epoch,w is -0.997179,loss is 0.000022
After 15 epoch,w is -0.998307,loss is 0.000008
After 16 epoch,w is -0.998984,loss is 0.000003
After 17 epoch,w is -0.999391,loss is 0.000001
After 18 epoch,w is -0.999634,loss is 0.000000
After 19 epoch,w is -0.999781,loss is 0.000000
After 20 epoch,w is -0.999868,loss is 0.000000
After 21 epoch,w is -0.999921,loss is 0.000000
After 22 epoch,w is -0.999953,loss is 0.000000
After 23 epoch,w is -0.999972,loss is 0.000000
After 24 epoch,w is -0.999983,loss is 0.000000
After 25 epoch,w is -0.999990,loss is 0.000000
After 26 epoch,w is -0.999994,loss is 0.000000
After 27 epoch,w is -0.999996,loss is 0.000000
After 28 epoch,w is -0.999998,loss is 0.000000
After 29 epoch,w is -0.999999,loss is 0.000000
After 30 epoch,w is -0.999999,loss is 0.000000
After 31 epoch,w is -1.000000,loss is 0.000000
After 32 epoch,w is -1.000000,loss is 0.000000
After 33 epoch,w is -1.000000,loss is 0.000000
After 34 epoch,w is -1.000000,loss is 0.000000
After 35 epoch,w is -1.000000,loss is 0.000000
After 36 epoch,w is -1.000000,loss is 0.000000
After 37 epoch,w is -1.000000,loss is 0.000000
After 38 epoch,w is -1.000000,loss is 0.000000
After 39 epoch,w is -1.000000,loss is 0.000000
学习来源:人工智能实践:Tensorflow笔记