我是靠谱客的博主 阔达短靴,最近开发中收集的这篇文章主要介绍基于python手写深度学习网络系列(5)神经网络的学习能力基于python手写深度学习网络系列(5),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

基于python手写深度学习网络系列(5)

神经网络的学习能力

学习就是从训练数据中自动获取最优权重参数的过程

这里所说的“特征量”是指可以从输入数据(输入图像)中准确地提取本质数据(重要的数据)的转换器,常用的计算机视觉领域的特征量包括SIFT、SURF、HOG,将数据一般转化成向量的形式,然后再使用SVM,KNN等分类器进行学习(这是机器学习的过程)

为了正确评价模型的泛化能力,就必须划分训练数据和测试数据。另外,训练数据也可以称为监督数据,泛化能力就是处理训练数据之外的数据的能力。

过拟合(over fitting)

损失函数一般使用均方误差(mean squared error)和交叉熵误差

Yk是神经网络的输出,tk是监测数据,k是维度

将正确解标签表示为1,其他标签表示为0 的表示方法称为one-hot 表示。

交叉熵误差

在考虑训练数据集时就要考虑所有数据损失函数的总和,交叉熵误差就会变成下面这样

我们从全部数据中选出一部分,作为全部数据的“近似”。神经网络的学习也是从训练数据中选出一批数据(称为mini-batch,小批量),然后对每个mini-batch 进行学习

在大量数据中抽取十个数据可以用np.random.choice()

这个可以同时处理单个数据或者批量数据

监督数据是标签形式时

y[np.arange(batch_size),t]能抽出各个数据的正确解标签对应的神经网络的输出(在这个例子中,y[np.arange(batch_size), t] 会生成NumPy 数组[y[0,2], y[1,7], y[2,0],

y[3,9], y[4,4]])。

 

为什么要引入损失函数,不直接用精度?

在进行神经网络的学习时,不能将识别精度作为指标。因为如果以识别精度为指标,则参数的导数在绝大多数地方都会变为0。

为什么会变0?识别精度对微小的参数变化基本没有反应,跃迁函数的导数在绝大多数地方都为0.

想要实现沿着梯度的下降,就需要先计算倒数,偏导数,乃至梯度

 

此代码有个问题

在grad[idx]那里,如果不加上编号,那么计算出啦就是一个值而不是一个数组。

那么代码中的lambda应该怎么用呢?编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。

map() 函数,它可以将一个函数映射到一个可枚举类型上面。

map(f, a)也就是将函数 f 依次套用在 a 的每一个元素上面,获得结果 [2, 3, 4]。现在用 lambda 表达式来替换 f,就变成:map( lambda x : x + 1, [1, 2, 3] )

所以在上面代码中的lambda起到的作用就是将d*t+y的值赋给t然后再return

这里的quiver函数还需要理解一下。

quiver(U, V, **kw)
quiver(U, V, C, **kw)
quiver(X, Y, U, V, **kw)
quiver(X, Y, U, V, C, **kw)

 

寻找最小值的方法叫梯度下降法,寻找最大值的叫梯度上升法。

η 表示更新量,在神经网络的学习中,称为学习率,属于超参数,与权重和偏置不同,是人工设定的。

这是提供的代码和图像结果

学习效率过大或过小都不行

上边是损失函数关于权重参数的梯度

接下来以一个简单的神经网络为例,来实现求梯度的代码

首先是一个简单的神经网络,权重参数是通过高斯函数生成的。

输入变量,可以得到最后的损失函数

这里的参数W并不是真正的W,实际上这个函数还是求在W情况下,输入x,t后的损失函数值

在numerical_gradient中会执行f这个函数,net.W是传给f的参数。

这里可以用lambda快速创建匿名函数,这里用的是将net.loss的结果赋值给w

实际上赋值给谁都一样,最后f都要等于赋值给的那个值,相当于一个连等

这是为了对应形状为多维数组的权重参数W,使用的numerical_gradient函数

这里猜测it是定义了一个迭代器

算法的步骤总结:

  1. 选取mini-batch小数据包
  2. 计算损失函数对权重的梯度
  3. 沿梯度方向更新权重
  4. 重复步骤123

 

Mini-batch是随机选择的,所以称为随机梯度下降法。(对随机算则的数据进行的梯度下降法)stochastic gradient descent,很多深度学习框架中,以SGD为名的函数实现该算法。

实现twolayernet的代码如下,其中要注意的是:

求精确度时,对卷积结果最大值的判定是对一行进行判定,每一行是一个结果,然后minibatch中有多少组数据就有多少列,所以argmax要加上参数axis = 1.默认等于1是对列进行判定。

这里是开始利用之前写的类进行Mnist手写数字识别数据集进行测试

过拟合:虽然训练数据中的数字图像能被正确识别,但是不在训练数据中的数字图像却无法被识别的现象。

Epoch:一个epoch表示学习中所有训练数据均被使用过一次时的更新次数。对于总共10000笔训练数据,用大小100笔数据的小批量学习时,重复随机梯度下降法100次,所有的数据就遍历了。(实际上,先将所有数据打乱,然后按指定的批次大小,按序生成minibatch,每个minibatch都有一个索引号,按序遍历即可)

改正后代码有了小变化

进行判定后,每一个epoch计算一次,然后绘图

 

那么这种数值方法求解梯度的方法胜在比较好理解,但是需要大量的运算,下一篇我们就要用误差反向传播来改善它!

最后

以上就是阔达短靴为你收集整理的基于python手写深度学习网络系列(5)神经网络的学习能力基于python手写深度学习网络系列(5)的全部内容,希望文章能够帮你解决基于python手写深度学习网络系列(5)神经网络的学习能力基于python手写深度学习网络系列(5)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部