神经网络识别手写优化(二)

前言

本文接着一写的,还是对之前实现的神经网络进行一个优化。

DropOut

这个东西也是防止过拟合的。意思就是每一轮训练完了之后,丢弃掉一些神经元。从而防止过拟合。

这是什么原理?

因为我们网络的神经元过多,有些神经元把没有泛化能力的特征记录了下来,通俗来说就是把无关紧要的东西记录了下来。及时在训练集上表现的特别好,cost会降到很低,但是在验证集上反而会升高,因为验证集上的数据可能不包括那些无关紧要的东西。
这个好比如,让计算机识别人类,给他很多张照片,照片上有很多朋友脸上有痣。神经元结构过于庞大,它们会把有痣这个特征记忆下来,认为有痣的
是人类的可能性很大。但是验证集或者测试集上面很多没有痣的朋友,计算机就认为他不是个人。

解决方法
就是在网络训练过程中,丢弃掉一些神经元,从而改变网络的结构。防止过拟合的发生。而丢弃哪些节点呢?一般都是随机的….

交叉墒代价函数

在之前使用的代价函数是
损失函数
上一篇说了在后面可以加上一个正则项。但是这一项还是没有发生改变。那么这一项有什么问题呢?
image.png

image.png

问题就出在sigmod’(z)的导数上面。看函数图像
image.png

可以看出当w小于-4或者大于4的时候导数几乎为0。那么w收敛会贼慢。那么怎么才能避免求sigmod的导数呢?只有引进一个损失函数,那就是交叉墒代价函数。
image.png
这个并不复杂。其中激励函数等于。
image.png
下面我们一步一步的进行推导:
image.png

其实不难的,大家一步一步来,就是高数的链式法则。
同理看看权重的导数。
image.png
这里就没有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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值