深度学习2

神经网络学习

机器学习中,一般将数据分为训练数据和测试数据。训练数据也称为监督数据。
泛化能力是指处理未被观察过的数据(不包含在训练数据中的数据)的能力。
对某个数据集过度拟合的状态称为过拟合(over fitting)。

损失函数

损失函数(loss function)是表示神经网络性能的“恶劣程度”的指标,即当前的神经网络对监督数据在多大程度上不拟合,在多大程度上不一致。

均方误差

mean squared error
公式如下:
E = 1 2 k ( y k t k ) 2 E=\frac{1}{2}\sum_{k} \left ( y_{k}-t_{k}\right )^{2}
y k y_{k} 是表示神经网络的输出, t k t_{k} 表示监督数据, k k 表示数据的维数。

交叉熵误差

cross entropy error
E = k t k l o g y k E=-\sum_{k}{t_{k} \\log y_{k}} 在这里插入图片描述

自然对数y = log x的图像

x等于1时,y为0;随着x向0靠近,y逐渐变小。
正确解标签对应的输出越大,交叉熵误差越接近0;当输出为1时,交叉熵误差为0。
正确解标签对应的输出较小,交叉熵误差较大。

def cross_entropy_error(y, t):
	delta = 1e-7
	return -np.sum(t * np.log(y + delta))

参数y和t是NumPy数组,当出现np.log(0)时,np.log(0)会变为负无限大的-inf,故加上了一个微小值delta。

mini-batch学习

神经网络的学习也是从训练数据中选出一批数据(称为mini-batch, 小批量),然后对每个mini-batch 进行学习。

训练数据的损失函数的总和, 以交叉熵误差为例

E = 1 N n k t n k l o g y n k E=-\frac{1}{N}\sum_{n}\sum_{k}{t_{nk} \\log y_{nk}}
数据有 N N 个, t n k t_{nk} 表示第 n n 个数据的第 k k 个元素的值( y n k y_{nk} 是神经网络的输出, t n k t_{nk} 是监督数据)
通过除以 N N ,可以求单个数据的“平均损失函数”。通过这样的平均化,可以获得和训练数据的数量无关的统一指标。

使用np.random.choice()可以从指定的数字中随机选择想要的数字

>>> np.random.choice(60000, 10)
array([ 8013, 14666, 58210, 23832, 52091, 10153, 8107, 19410, 27260,21411])

同时处理单个数据和批量数据(数据作为batch 集中输入)两种情况
监督数据为one-hot表示 ,交叉熵误差代码实现如下:

def cross_entropy_error(y, t):
    if y.ndim == 1:
        t = t.reshape(1, t.size)
        y = y.reshape(1, y.size)
    batch_size = y.shape[0]
    return -np.sum(t * np.log(y + 1e-7)) / batch_size

y是神经网络的输出,t是监督数据。
y的维度为1 时,即求单个数据的交叉熵误差时,需要改变数据的形状。

监督数据为标签形式(非one-hot表示),交叉熵误差代码实现如下:

def cross_entropy_error(y, t):
    if y.ndim == 1:
        t = t.reshape(1, t.size)
        y = y.reshape(1, y.size)
    batch_size = y.shape[0]
    return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / batch_size

np.log( y[np.arange(batch_size), t] )
假设batch_size为5,np.arange(5)生成一个NumPy 数组[0, 1, 2, 3, 4]
t中标签是以[2, 7, 0, 9, 4]的形式存储的。
y[np.arange(batch_size), t] 会生成NumPy 数组[y[0,2], y[1,7], y[2,0],y[3,9], y[4,4]])。

>>> y=np.arange(36).reshape(6,6)	       
>>> y	       
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35]])
>>> t=np.array([5,4,3,2,1])
>>> a=y[np.arange(5),t]
>>> a
array([ 5, 10, 15, 20, 25])

猜你喜欢

转载自blog.csdn.net/kobeboa/article/details/86291547
今日推荐