当前位置:网站首页 > Haskell函数式编程 > 正文

cnn算法公式(cnn计算公式)



 
 
   
   
点击上方 小白学视觉 ”,选择加" 星标 "或“ 置顶
 
  
    
    
重磅干货,第一时间送达

统计学习中的一个很重要的假设就是输入的分布是相对稳定的。如果这个假设不满足,则模型的收敛会很慢,甚至无法收敛。所以,对于一般的统计学习问题,在训练前将数据进行归一化或者白化(whitening)是一个很常用的trick。

但这个问题在深度神经网络中变得更加难以解决。在神经网络中,网络是分层的,可以把每一层视为一个单独的分类器,将一个网络看成分类器的串联。这就意味着,在训练过程中,随着某一层分类器的参数的改变,其输出的分布也会改变,这就导致下一层的输入的分布不稳定。分类器需要不断适应新的分布,这就使得模型难以收敛。

对数据的预处理可以解决第一层的输入分布问题,而对于隐藏层的问题无能为力,这个问题就是Internal Covariate Shift。而Batch Normalization其实主要就是在解决这个问题。

除此之外,一般的神经网络的梯度大小往往会与参数的大小相关(仿射变换),且随着训练的过程,会产生较大的波动,这就导致学习率不宜设置的太大。Batch Normalization使得梯度大小相对固定,一定程度上允许我们使用更高的学习率。

Batch Normalization的过程很简单。我们假定我们的输入是一个大小为 的mini-batch ,通过下面的四个式子计算得到的 就是Batch Normalization(BN)的值。

首先,由(2.1)和(2.2)得到mini-batch的均值和方差,之后进行(2.3)的归一化操作,在分母加上一个小的常数是为了避免出现除0操作。最后的(2.4)再对 进行一次线性变换得到BN的结果。整个过程中,只有最后的(2.4)引入了额外参数γ和β,他们的size都为特征长度,与 相同。

BN层通常添加在隐藏层的激活函数之前,线性变换之后。如果我们把(2.4)和之后的激活函数放在一起看,可以将他们视为一层完整的神经网络(线性+激活)。(注意BN的线性变换和一般隐藏层的线性变换仍有区别,前者是element-wise的,后者是矩阵乘法。)

此时, 可以视为这一层网络的输入,而 是拥有固定均值和方差的。这就解决了Covariate Shift.

另外, 还具有保证数据表达能力的作用。 在normalization的过程中,不可避免的会改变自身的分布,而这会导致学习到的特征的表达能力有一定程度的丢失。通过引入参数γ和β,极端情况下,网络可以将γ和β训练为原分布的标准差和均值来恢复数据的原始分布。这样保证了引入BN,不会使效果更差。

在训练过程中,还需要维护一个移动平均的均值和方差,这两个移动平均会用于推断过程。

再来用反向传播求梯度。我们先画出BN的计算图,由于节点的文本不支持Tex,其中x_即为

Batch Normalization的计算图

假定损失函数为L,已知L相对于 的偏导 ,求

前两个比较直观,求 需要用到 ,也很简单,这里直接列出。

从计算图和(2.3)中可以看出,要求 ,要分成 三部分来求。

我们还需要求

(3.6)可以由式(2.1)直接得到,(3.7)是运用链式法则的结果。

还需要

(3.8)可以由式(2.2)直接得到。

最后我们还需要方差的导数。

至此,(3.4)所需要的偏导都已求出,组合起来,我们得到最终的式子。

这个式子仍然具有进一步化简的空间。在展开之后,由式(2.3),通过拼凑,可以将 凑成 _。_再提取公因式 ,可以将式(3.10)化简成:

参考cs231n的assignment2,我们将Batch Normalization分成正向(只包括训练)和反向两个过程。

正向过程的参数x是一个mini-batch的数据,gamma和beta是BN层的参数,bn_param是一个字典,包括 的取值和用于inference的 的移动平均值,最后返回BN层的输出y,会在反向过程中用到的中间变量cache,以及更新后的移动平均。

反向过程的参数是来自上一层的误差信号dout,以及正向过程中存储的中间变量cache,最后返回 的偏导数。

实现与推导的不同在于,实现是对整个batch的操作。

import numpy as np
def batchnorm_forward(x, gamma, beta, bn_param): # read some useful parameter N, D = x.shape eps = bn_param.get('eps', 1e-5) momentum = bn_param.get('momentum', 0.9) running_mean = bn_param.get('running_mean', np.zeros(D, dtype=x.dtype)) running_var = bn_param.get('running_var', np.zeros(D, dtype=x.dtype))
# BN forward pass sample_mean = x.mean(axis=0) sample_var = x.var(axis=0) x_ = (x - sample_mean) / np.sqrt(sample_var + eps) out = gamma * x_ + beta
# update moving average running_mean = momentum * running_mean + (1-momentum) * sample_mean running_var = momentum * running_var + (1-momentum) * sample_var bn_param['running_mean'] = running_mean bn_param['running_var'] = running_var
# storage variables for backward pass cache = (x_, gamma, x - sample_mean, sample_var + eps)
return out, cache

def batchnorm_backward(dout, cache): # extract variables N, D = dout.shape x_, gamma, x_minus_mean, var_plus_eps = cache
# calculate gradients dgamma = np.sum(x_ * dout, axis=0) dbeta = np.sum(dout, axis=0)
dx_ = np.matmul(np.ones((N,1)), gamma.reshape((1, -1))) * dout dx = N * dx_ - np.sum(dx_, axis=0) - x_ * np.sum(dx_ * x_, axis=0) dx *= (1.0/N) / np.sqrt(var_plus_eps)
return dx, dgamma, dbeta
  1. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
  2. Deriving the Gradient for the Backward Pass of Batch Normalization
  3. CS231n Convolutional Neural Networks for Visual Recognition
 
  
    
    
 
       
         
         
下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复: 扩展模块中文教程 即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。


下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。


下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

到此这篇cnn算法公式(cnn计算公式)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 论文一二三级论文一二三级标题排版_本科论文一二三级标题格式怎么写(论文一二三级论文一二三级标题排版_本科论文一二三级标题格式怎么写顶格)2025-08-01 19:54:08
  • 需要使用安全选项卡win7(windows要使用安全模式启动,需在启动时按)2025-08-01 19:54:08
  • grid布局是什么(grid布局是什么布局方式)2025-08-01 19:54:08
  • 高德支付方式怎么设置(高德支付方式怎么设置微信支付)2025-08-01 19:54:08
  • 报告一级调查报告标题范文二级调查报告标题范文三级调查报告标题范文格式(报告中的一级二级调查报告标题范文)2025-08-01 19:54:08
  • ar模块是什么(ar模式是什么)2025-08-01 19:54:08
  • 进程控制块组织方案(进程控制块的组织方式有哪几种?)2025-08-01 19:54:08
  • 支付方式有哪些(北京地铁支付方式有哪些)2025-08-01 19:54:08
  • 华为模拟器怎么进入用户模式(华为模拟器使用教程)2025-08-01 19:54:08
  • 反激电路输出电压计算(反激电路输出电压计算公式)2025-08-01 19:54:08
  • 全屏图片