TensorFlow笔记_初识神经网络设计过程

神经网络设计过程

  1. 准备数据,要构成特征和标签对
  2. 搭建神经网络的网络结构
  3. 通过反向传播,优化连接的权重,直到模型的准确率达到要求,得到最优的连线权重,然后将模型保存起来
  4. 用保存的模型,输入从未见过的新数据,它会通过前向传播输出概率值,概率值最大的就是分类和预测的结果

鸢尾花分类为例

1构建数据集

数据集包括鸢尾花萼长、花萼宽、花瓣长、花瓣宽以及对应的类别,鸢尾花萼长、花萼宽、花瓣长、花瓣宽作为输入特征,类别作为标签,0代表狗尾草鸢尾,1代表杂色鸢尾,2代表弗吉尼亚鸢尾.

2搭建和训练网络

鸢尾花神经网络简要模型如下,y=w\cdot x+b,所有的输入x乘以各自线上的权重w求和加上偏置b得到输出y,输入特征x的形状为1行4列,输出y的形状为1行3列,权重w的形状为4行3列,有3个偏置项。

TensorFlow笔记_初识神经网络设计过程_第1张图片

 搭建神经网络模型如下,输入特征数据,并对线上权重w和偏置b进行初始化。

TensorFlow笔记_初识神经网络设计过程_第2张图片

 输入标签为0的狗尾草鸢尾,按照y=w\cdot x+b的方式进行前向传播,计算过程如下。

TensorFlow笔记_初识神经网络设计过程_第3张图片

通过输出y可以看出数值最大的时1类,而不是0类,这是由于最初参数w和b是随机产生的。

为了修正上述结果,用损失函数定义预测值和标准答案的差,当损失函数最小时,即可得到最优的w和b的值。均方误差是一种常用的损失函数,它计算了每个前向传播输出和标准答案的差求平方再除以n求平均,表征了网络前向传播推理结果和标准答案之间的差距。

 为了寻找一组w和b使得损失函数最小,采用梯度下降的方法。

损失函数的梯度表示损失函数对各参数求偏导后的向量,损失函数梯度下降的方向就是损失函数减小的方向。梯度下降法就是沿着损失函数梯度下降的方向,寻找损失函数的最小值,从而得到最优的参数。

梯度下降法公式如下,lr表示学习率,是一个超参数,表征梯度下降的速度。学习率过小,参数更新很慢,学习率过大,参数可能会在最小值附近跳动。

TensorFlow笔记_初识神经网络设计过程_第4张图片

 上述梯度下降法更新参数的过程为反向传播,反向传播是从后向前,逐层求损失函数对每层神经元参数的偏导数,迭代更新所有参数。

举个例子,损失函数为loss=(w+1)^2,loss最小时,w=-1,即w=-1是最优参数w。

TensorFlow笔记_初识神经网络设计过程_第5张图片

 程序实现上述例子的参数优化过程。

当学习率为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))

TensorFlow笔记_初识神经网络设计过程_第6张图片

 当学习率为0.001时,学习率过小,参数更新很慢,40轮训练无法找到最优值。

lr = 0.001  #学习率为0.001

TensorFlow笔记_初识神经网络设计过程_第7张图片

 当学习率为0.999时,学习率过大,参数在最优值两边跳动,同样无法找到最优值。

lr = 0.999  #学习率为0.999

 TensorFlow笔记_初识神经网络设计过程_第8张图片

你可能感兴趣的:(深度学习,神经网络,tensorflow,深度学习)