美文网首页人工智能大数据
人工智能00015 深度学习与图像识别书评15 图像分类识别预备

人工智能00015 深度学习与图像识别书评15 图像分类识别预备

作者: 良友知音 | 来源:发表于2023-10-11 07:50 被阅读0次

    4.2.2 梯度下降法

    接下来要重点介绍的梯度下降法。

    首先带大家简单认识一下梯度下降法。

    梯度下降算法(GradientDescent Optimization)是常用的最优化方法之一。

    “最优化方法”属于运筹学方法,是指在某些约束条件下,为某些变量选取哪些值,可以使得设定的目标函数达到最优的问题。

    最优化方法有很多种,常见的有梯度下降法、牛顿法、共轭梯度法,等等。

    由于本书的重点在于带领大家快速掌握“图像识别”的技能,因此暂时不对最优化方法进行展开,感兴趣的读者可以自行查阅相关资料进行学习。

    由于梯度下降是一种比较常见的最优化方法,而且在后续第5章、第7章的神经网络中我们也将使用梯度下降法来进行优化,因此我们将在本章详细介绍该方法。

    接下来我们以图形化的方式带领读者学习梯度下降法。

    首先在Pycharm中新建一个Python文件,然后输入以下代码:

    import numpy as np

    import matplotlib.pyplot as plt

    if __name__ == '__main__':

       plot_x = np.linspace(-1, 6, 141)                        #从-1到6选取141个点

       plot_y = (plot_x - 2.5) ** 2 – 1                        #二次方程的损失函数

       plt.scatter(plot_x[5], plot_y[5], color='r')            #设置起始点,颜色为红色

       plt.plot(plot_x, plot_y)

       #设置坐标轴名称

       plt.xlabel('theta', fontproperties='simHei', fontsize=15)

       plt.ylabel('损失函数', fontproperties='simHei', fontsize=15)

       plt.show()  

    通过上述代码,运行后,x轴代表的是我们待学习的参数θ(theta),y轴代表的是损失函数的值(即Loss值),曲线y代表的是损失函数。

    我们的目标是希望通过大量的数据训练和调整参数θ,使损失函数的值最小。

    可以通过求导数的方式,达到二次方程的最小值点,使得导数为0即可。

    也就是说,横轴上2.5的位置所对应的损失函数值最小,在该点上一元二次方程(x-2.5)2-1切线的斜率为0。

    暂且将导数描述为,其中J为损失函数,为待求解的参数。 梯度下降中有个比较重要的参数:学习率η(读作eta,有时也称其为步长),它控制着模型寻找最优解的速度。

    加入学习率之后其数学表达为。

    1)首先定义损失函数及其导数,代码如下:  def J(theta):        #损失函数

       return (theta-2.5)**2 -1

    def dJ(theta):        #损失函数的导数

       return 2 * (theta - 2.5)  2)通过Matplotlib绘制梯度下降迭代过程,具体代码如下:

    theta = 0.0             #初始点

    theta_history = [theta]

    eta = 0.1               #步长

    epsilon = 1e-8          #精度问题或者eta的设置无法使得导数为0

    while True:

       gradient = dJ(theta)                     #求导数

       last_theta = theta                       #先记录下上一个theta的值

       theta = theta - eta * gradient           #得到一个新的theta

       theta_history.append(theta)

       if(abs(J(theta) - J(last_theta))  < epsilon):

           break                                #当两个theta值非常接近的时候,终止循环

    plt.plot(plot_x,J(plot_x),color='r')

    plt.plot(np.array(theta_history),J(np.array(theta_history)),color='b',marker='x')

    plt.show()              #一开始的时候导数比较大,因为斜率比较陡,后面慢慢平缓了

    print(len(theta_history))

    #一共走了46步接下来我们看一下所绘制的图像是什么样子,可以观察到θ从初始值0.0开始不断地向下前进,一开始下降的幅度比较大,之后慢慢趋于缓和,逐渐接近导数为0,一共走了46步。

    相关文章

      网友评论

        本文标题:人工智能00015 深度学习与图像识别书评15 图像分类识别预备

        本文链接:https://www.haomeiwen.com/subject/qjewbdtx.html