5
SIFT
、SURF
、HOG
),再通过分类器(SVM
、KNN
等)学习。监督数据
(监督着学习过程的数据)泛化能力
指处理没见过的数据的能力过拟合
损失函数表示性能在多大程度上不拟合,即恶劣程度
用损失函数的负数表示性能在多大程度上拟合,即优良程度
均方误差
和交叉熵误差
等。公式如下:
E = 1 2 ∑ k ( y k − t k ) 2 E=\frac{1}{2}\sum_{k}(y_k-t_k)^2 E=21k∑(yk−tk)2
python实现如下:
def mean_squared_error(y,t):
return 0.5*np.sum((y-t)**2)
例子如下:
import numpy as np
def mean_squared_error(y,t):
return 0.5*np.sum((y-t)**2)
t=np.array([0, 0, 1, 0, 0, 0, 0, 0, 0, 0])
y=np.array([0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0])
print(mean_squared_error(y,t))
y=np.array([0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0])
print(mean_squared_error(y,t))
运行结果如下:
0.09750000000000003
0.5975
可以知道,对于神经网络模型得到输出概率最高与监督数据不符时,损失函数的结果会增大,表示恶劣程度较高
公式如下:
E = − ∑ k t k ln y k E=-\sum_{k}t_k\ln{y_k} E=−k∑tklnyk
− ln x -\ln{x} −lnx对应的函数图像如下:
而 0 ≤ y k ≤ 1 0\leq{yk}\leq1 0≤yk≤1
所以输出的概率越小损失函数越大,和监督数据越不吻合。
python实现如下:
def cross_entropy_error(y,t):
delta=1e-7 #delta用来防止log(0)=infinity的出现
return -np.sum(t*np.log(y+delta))
同样按照均方误差的例子来调用,得到的运行结果如下:
0.510825457099338
2.302584092994546
之前我们将一个数据条的损失函数讨论了,如果有N个数据,每个数据有分别有很多需要对比的元素,则交叉熵误差公式如下:
E = − 1 N ∑ N ∑ k t n k ln y n k E=-\frac{1}{N}\sum_{N}\sum_{k}t_{nk}\ln{y_{nk}} E=−N1N∑k∑tnklnynk
如果数据量特别大时,求和会是一件很耗时的工作,所以这时候只用一部份,作为全部数据的“近似”,称为小批量(mini-batch)
,如用60000个数据取100个学习,称为 mini-batch 学习。
这时我们回忆上一章读入mnist数据集的情况:
60000
个,输入数据是 784
维(28 × 28)的图像数据,监督数据是 10
维的数据。因此,上面的 x_train、t_train
的形状分别是 (60000, 784)
和 (60000, 10)
。在其中随机抽取10个数据用np.random.choice(train_size, batch_size)
代码:
train_size = x_train.shape[0] #训练数据第0维数值,代表有多少个数据
batch_size = 10 #要选出多少数据
batch_mask = np.random.choice(train_size, batch_size) #选出的数据位置放入batch_mask
x_batch = x_train[batch_mask] #把这些位置上的输入数据取出来放入x_batch作为mini—batch学习的输入数据
t_batch = t_train[batch_mask] #把这些位置上的监督数据取出来放入t_batch作为mini—batch学习的监督数据
def cross_entropy_error(y, t):
if y.ndim == 1: #一维数组要把第一维放到第二维,表示只有一条数据
t = t.reshape(1, t.size) #reshape函数代两维的参数
y = y.reshape(1, y.size)
batch_size = y.shape[0] #记下第一维的数值,表示有多少条数据
return -np.sum(t * np.log(y + 1e-7)) / batch_size
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 #根据start与stop指定的范围以及step设定的步长,生成一个 array,一个参数batch_size时,从0到batch_size,step=1,生成一个数组。
识别精度:相当于监督数据是n个t,k个输出y,识别出了m个,识别精度是m/n
损失函数:相当于监督数据有n个t,k个输出y,识别出了m个,用一个函数function(n,k)拟合出两个之间的差别程度,损失函数越小,说明识别的越符合
end
《陆宇杰的训练营:15天共读深度学习》 ↩︎