神经网络识别手写优化(二)
来源:互联网 发布:阿里云 iis 404 编辑:程序博客网 时间:2024/06/16 18:30
前言
本文接着一写的,还是对之前实现的神经网络进行一个优化。
DropOut
这个东西也是防止过拟合的。意思就是每一轮训练完了之后,丢弃掉一些神经元。从而防止过拟合。
这是什么原理?
因为我们网络的神经元过多,有些神经元把没有泛化能力的特征记录了下来,通俗来说就是把无关紧要的东西记录了下来。及时在训练集上表现的特别好,cost会降到很低,但是在验证集上反而会升高,因为验证集上的数据可能不包括那些无关紧要的东西。
这个好比如,让计算机识别人类,给他很多张照片,照片上有很多朋友脸上有痣。神经元结构过于庞大,它们会把有痣这个特征记忆下来,认为有痣的
是人类的可能性很大。但是验证集或者测试集上面很多没有痣的朋友,计算机就认为他不是个人。
解决方法
就是在网络训练过程中,丢弃掉一些神经元,从而改变网络的结构。防止过拟合的发生。而丢弃哪些节点呢?一般都是随机的….
交叉墒代价函数
在之前使用的代价函数是
上一篇说了在后面可以加上一个正则项。但是这一项还是没有发生改变。那么这一项有什么问题呢?
问题就出在sigmod’(z)的导数上面。看函数图像
可以看出当w小于-4或者大于4的时候导数几乎为0。那么w收敛会贼慢。那么怎么才能避免求sigmod的导数呢?只有引进一个损失函数,那就是交叉墒代价函数。
这个并不复杂。其中激励函数等于。
下面我们一步一步的进行推导:
其实不难的,大家一步一步来,就是高数的链式法则。
同理看看权重的导数。
这里就没有sigmod的导数,导数直接抵消了。这样学习就会很快了。
代码部分
class CrossEntropyCost(object): """ 交叉墒代价函数 """ @staticmethod def fn(a,y): """ 避免出现nan,inf nan_to_num 把这玩意改成数字 :param a: :param y: :return: """ return np.sum(np.nan_to_num(-y * np.log(a) - (1-y) * no.log(1-a))) @staticmethod def delta(z,a,y): """ :param z:无用 :param a: :param y: :return: """ return a-y
阅读全文
0 0
- 神经网络识别手写优化(二)
- 神经网络识别手写优化(一)
- 神经网络识别手写优化(三)
- 机器学习之 神经网络的实现(二)-->手写识别
- 卷积神经网络(cnn) 手写数字识别
- 卷积神经网络(cnn) 手写数字识别
- 神经网络实现手写数字识别(MNIST)
- 神经网络与机器学习(二)——识别手写数字示例
- 使用神经网络识别手写数字
- 【TensorFlow】神经网络MNIST手写识别
- 利用神经网络识别手写数字
- 初识神经网络--识别手写数字
- Python神经网络识别手写字体
- 神经网络:简单手写数字识别神经网络
- 第一章 用神经网络识别手写数字(第一节 感知器)
- Neural Network(神经网络)实例--手写数字识别
- TensorFlow实战-mnist手写数字识别(卷积神经网络)
- 读书笔记-神经网络与深度学习(一)-使用神经网络识别手写数字
- 【Scikit-Learn 中文文档】密度估计
- 把一个Apple ID加到developer team里
- STM32三种启动模式
- npm发布自己的vue插件/组件包
- Spring
- 神经网络识别手写优化(二)
- 【Scikit-Learn 中文文档】聚类
- Maven install:javac:无效的目标版本1.8
- Zookeeper配置文件参数与含义
- Angular4_父子组件,组件之间交互
- keil仿真时查看变量出现 not in scope 问题的解决
- Express blog从零开始搭建(2)
- HDU 2084 数塔(DP)
- 【Scikit-Learn 中文文档】神经网络模型(无监督)- 无监督学习