美文网首页人工智能大数据
人工智能00027 深度学习与图像识别书评27 神经网络基础09

人工智能00027 深度学习与图像识别书评27 神经网络基础09

作者: 良友知音 | 来源:发表于2023-12-03 08:14 被阅读0次

    神经网络模型训练得以实现是经过前向传播计算Loss,根据Loss的值进行反向推导,并进行相关参数的调整。

    Loss是指导参数进行调整的方向性的指导,是很关键的值,如果Loss随意指示下降的方向,那么可能会出现的问题是,无论经过多少次迭代,都是没有目标的随意游走,这样的话又怎么可能到达Loss最低点呢?

    在神经网络的训练中,对于损失函数的选取、以及梯度下降的各个参数的调整都是尤为重要的。

    使用的最主要的损失函数是均方误差和交叉熵误差。

    均方误差(meansquarederror)是各数据偏离真实值的距离平方和的平均数,也即误差平方和的平均数,用σ表示。

    均方误差可以用作机器学习中的损失函数,用于预测和回归。均方误差

    用Python代码实现,具体如下:

    def mean_squared_error(p,y):

       return np.sum((p-y)**2)/y.shape[0]  

    下面回到动物分类的例子,我们将猫分为类1,狗分为类2,小鸡分类为3,如果不属于以上任何一类就分到“其他”类(或者说,“以上均不符合”这一类),我们将它称为类0。

    假设我们在这里输入了一张猫的图片,其对应的真实标签是0100(类别已经转换成了one-hot编码形式):

    我们通过代码来看下,下述代码的输出是0.22500000000000003:  import numpy as np

    y = np.array([0,1,0,0])                #y是真实标签

    p = np.array([0.3,0.2,0.1,0.4])        #通过Softmax得到的概率值

    def mean_squared_error(p,y):

        return np.sum((p-y)**2)/y.shape[0]

    print(mean_squared_error(p,y))

    如果分类的类别是正确的,则输出是0.055000000000000014:  import numpy as np

    y = np.array([0,1,0,0])

    p = np.array([0.2,0.6,0.1,0.1])

    def mean_squared_error(p,y):

        return np.sum((p-y)**2)/y.shape[0]

    print(mean_squared_error(p,y))

    假设上述两个例子是图像分类,第一个例子中,我们输入的图片是猫,但是神经网络认为是鸡,其损失函数的输出 约为0.23;第二个例子中,我们输入的图片是猫,神经网络也认为是猫(概率比较大的那个),其损失函数的输出约为0.055。

    从上述结果中,我们可以发现,第二个例子的损失函数输出更小,这也就意味着其与真实值之间的误差更小。

    交叉熵误差

    同样的例子,在使用Softmax层时,对应的目标值y以及训练结束前某次输出的概率值y_predict(Softmax得到的是针对每一个类别的概率值)分别为:

    Softmax使用的损失函数为交叉熵,其中C代表类别数量:    在训练过程中,我们的目标是最小化Loss的值,y已经是one-hot类型了,我们输入的图片是猫,所以我们可以知道y1=y3=y4=0,y2=1(为便于理解初始索引为1),所以带入Loss函数中可以得到:

    所以为了最小化Loss,我们的目标就变成了使得y_predict2的概率尽可能地大。上述公式是一个样本所得到的Loss函数值,最后我们累加训练集中的Loss函数值。

    这里用Python代码来实现,其中,p代表预测值;y代表真实值,实现代码具体如下:

    def cross_entropy_error(p,y):

       return np.sum(-y*np.log(p))  

    下面依然通过上述例子来求解一遍以查看效果,值得注意的是,为了避免出现log(0),所以我们增加了一个delta值。下述代码的输出是1.6094374124342252,具体实现如下:

    import numpy as np

    def cross_entropy_error(p,y):

       delta = 1e-7

       return np.sum(-y*np.log(p+delta))

    y = np.array([0,1,0,0])

    p = np.array([0.3,0.2,0.1,0.4])

    print(cross_entropy_error(p,y))

    第二个例子的输出是0.510825457099338,具体实现如下:

    import numpy as np

    y = np.array([0,1,0,0])

    p = np.array([0.2,0.6,0.1,0.1])

    def cross_entropy_error(p,y):

       delta = 1e-7return np.sum(-y*np.log(p+delta))

    print(cross_entropy_error(p,y))  

    述示例我们可以得出同样的结论:当真实类别与神经网络给出的类别相同的时候,损失函数的输出比较小。

    相关文章

      网友评论

        本文标题:人工智能00027 深度学习与图像识别书评27 神经网络基础09

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