人工智能大数据

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

2023-12-03  本文已影响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))  

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

上一篇下一篇

猜你喜欢

热点阅读