一、疑问

1. assignments2

  • 在代码文件FullyConnectedNets.ipynd 中,有代码如下:
  # Test the affine_forward function

  num_inputs = 2
input_shape = (4, 5, 6)
output_dim = 3 input_size = num_inputs * np.prod(input_shape)
weight_size = output_dim * np.prod(input_shape) x = np.linspace(-0.1, 0.5, num=input_size).reshape(num_inputs, *input_shape)
w = np.linspace(-0.2, 0.3, num=weight_size).reshape(np.prod(input_shape), output_dim)
b = np.linspace(-0.3, 0.1, num=output_dim) out, _ = affine_forward(x, w, b)
correct_out = np.array([[ 1.49834967, 1.70660132, 1.91485297],
[ 3.25553199, 3.5141327, 3.77273342]]) # Compare your output with ours. The error should be around 1e-9.
print 'Testing affine_forward function:'
print 'difference: ', rel_error(out, correct_out)

此处用np.prodnp.linspace等一系列函数初始化权重w和x,与之前直接用np.random等函数想比略显复杂,如此初始化的好处是什么?

**A: **在这个代码模块里,最主要是为了测试前向传播函数是否实现正确,所以需要固定的权重和数据来得出结果,以和函数的输出进行对比。而之前随机生成的数据输出结果也是随机的,无法用于判定实现的前向传播函数是否正确。

  • 当用多层FC网络过拟合50个样本时,如果网络层数越深,随机初始化权重时,所用的weight_scale应当越大点。

二、知识点

1. im2col操作

用矩阵乘法实现:卷积运算本质上就是在滤波器和输入数据的局部区域间做点积。卷积层的常用实现方式就是利用这一点,将卷积层的前向传播变成一个巨大的矩阵乘法:

  1. 输入图像的局部区域被im2col操作拉伸为列。比如,如果输入是[227x227x3],要与尺寸为11x11x3的滤波器以步长为4进行卷积,就取输入中的[11x11x3]数据块,然后将其拉伸为长度为11x11x3=363的列向量。重复进行这一过程,因为步长为4,所以输出的宽高为(227-11)/4+1=55,所以得到im2col操作的输出矩阵X_col的尺寸是[363x3025],其中每列是拉伸的感受野,共有55x55=3,025个。注意因为感受野之间有重叠,所以输入数据体中的数字在不同的列中可能有重复。
  2. 卷积层的权重也同样被拉伸成行。举例,如果有96个尺寸为[11x11x3]的滤波器,就生成一个矩阵W_row,尺寸为[96x363]。
  3. 现在卷积的结果和进行一个大矩阵乘np.dot(W_row, X_col)是等价的了,能得到每个滤波器和每个感受野间的点积。在我们的例子中,这个操作的输出是[96x3025],给出了每个滤波器在每个位置的点积输出。
  4. 结果最后必须被重新变为合理的输出尺寸[55x55x96]。

这个方法的缺点就是占用内存太多,因为在输入数据体中的某些值在X_col中被复制了多次。但是,其优点是矩阵乘法有非常多的高效实现方式,我们都可以使用(比如常用的BLAS API)。还有,同样的im2col思路可以用在汇聚操作中。

三、归一化层(Batch normalization)

**Q: **在神经网络训练开始前,都要对输入数据做一个归一化处理,那为什么需要归一化呢?

**A: **神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另外一方面,一旦每批训练数据的分布各不相同(batch 梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对数据都要做一个归一化预处理的原因。

1. 定义

批量归一化。让激活数据在训练开始前通过一个网络,网络处理数据使其服从标准高斯分布。使用了批量归一化的网络对于不好的初始值有更强的鲁棒性。

2. 优点

  • BN解决了反向传播过程中的梯度问题(梯度消失和爆炸),同时使得不同scale的 整体更新步调更一致。在神经网络训练时遇到收敛速度很慢,或梯度爆炸等无法训练的状况时可以尝试BN来解决。另外,在一般使用情况下也可以加入BN来加快训练速度,提高模型精度。
  • 减少坏初始化的影响;
  • 加快模型的收敛速度;
  • 可以用大些的学习率
  • 能有效地防止过拟合。

3. 前向传播过程公式

4. 反向传播求导公式

5. 代码

sample_mean = K.mean(X, axis=-1, keepdims=True)#计算均值
sample_var = K.std(X, axis=-1, keepdims=True)#计算标准差
X_normed = (X - sample_mean) / (sample_var + self.epsilon)#归一化
out = self.gamma * X_normed + self.beta#重构变换 running_mean = momentum * running_mean + (1 - momentum) * sample_mean
running_var = momentum * running_var + (1 - momentum) * sample_var

out = self.gamma * X_normed + self.beta 这个操作为“scale and shift”操作。为了让因训练所需而“刻意”加入的BN能够有可能还原最初的输入(即当),从而保证整个network的capacity。(实际上BN可以看作是在原模型上加入的“新操作”,这个新操作很大可能会改变某层原来的输入。当然也可能不改变,不改变的时候就是“还原原来输入”。如此一来,既可以改变同时也可以保持原输入,那么模型的容纳能力(capacity)就提升了。)

​ 当引入BN层,原始的数据分布可能会因此遭到破坏,从而导致网络的loss变大,则在反向传播中,可以使用梯度更新规则对参数gammabeta进行更新,从而接用“scale and shift”操作,以求可能保持原输入的部分特征。

​ 我们训练时使用一个minibatch的数据,因此可以计算均值和方差,但是预测时一次只有一个数据,所以均值方差都是0,那么BN层什么也不干,原封不动的输出。这肯定会用问题,因为模型训练时是进过处理的,但是测试时又没有,那么结果肯定不对。

​ 解决的方法是使用训练的所有数据,也就是所谓的population上的统计。不过这需要训练完成之后在多出一个步骤。一种常见的办法就是基于momentum的指数衰减,这和低通滤波器类似。每次更新时把之前的值衰减一点点(乘以一个momentum,一般很大,如0.9,0.99),然后把当前的值加一点点进去(1-momentum)。

【CS231N】7、卷积神经网络的更多相关文章

  1. 『cs231n』卷积神经网络的可视化与进一步理解

    cs231n的第18课理解起来很吃力,听后又查了一些资料才算是勉强弄懂,所以这里贴一篇博文(根据自己理解有所修改)和原论文的翻译加深加深理解,其中原论文翻译比博文更容易理解,但是太长,而博文是业者而非 ...

  2. 【cs231n】卷积神经网络

    较好的讲解博客: 卷积神经网络基础 深度卷积模型 目标检测 人脸识别与神经风格迁移 译者注:本文翻译自斯坦福CS231n课程笔记ConvNet notes,由课程教师Andrej Karpathy授权 ...

  3. 『cs231n』卷积神经网络工程实践技巧_下

    概述 计算加速 方法一: 由于计算机计算矩阵乘法速度非常快,所以这是一个虽然提高内存消耗但是计算速度显著上升的方法,把feature map中的感受野(包含重叠的部分,所以会加大内存消耗)和卷积核全部 ...

  4. 『cs231n』卷积神经网络工程实践技巧_上

    概述 数据增强 思路:在训练的时候引入干扰,在测试的时候避免干扰. 翻转图片增强数据. 随机裁切图片后调整大小用于训练,测试时先图像金字塔制作不同尺寸,然后对每个尺寸在固定位置裁切固定大小进入训练,最 ...

  5. CS231n课程笔记翻译9:卷积神经网络笔记

    译者注:本文翻译自斯坦福CS231n课程笔记ConvNet notes,由课程教师Andrej Karpathy授权进行翻译.本篇教程由杜客和猴子翻译完成,堃堃和李艺颖进行校对修改. 原文如下 内容列 ...

  6. Stanford CS231n实践笔记(课时14卷积神经网络详解 上)

    本课我们主要来研究一个"浏览器中的卷积神经网络" 这只是一个展示项目,但是能够帮助直观地看到一些东西 地址:https://cs.stanford.edu/people/karpa ...

  7. CNN卷积神经网络在自然语言处理的应用

    摘要:CNN作为当今绝大多数计算机视觉系统的核心技术,在图像分类领域做出了巨大贡献.本文从计算机视觉的用例开始,介绍CNN及其在自然语言处理中的优势和发挥的作用. 当我们听到卷积神经网络(Convol ...

  8. CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?

    https://www.zhihu.com/question/34681168 CNN(卷积神经网络).RNN(循环神经网络).DNN(深度神经网络)的内部网络结构有什么区别?修改 CNN(卷积神经网 ...

  9. 卷积神经网络(CNN)模型结构

    在前面我们讲述了DNN的模型与前向反向传播算法.而在DNN大类中,卷积神经网络(Convolutional Neural Networks,以下简称CNN)是最为成功的DNN特例之一.CNN广泛的应用 ...

  10. 卷积神经网络(CNN)前向传播算法

    在卷积神经网络(CNN)模型结构中,我们对CNN的模型结构做了总结,这里我们就在CNN的模型基础上,看看CNN的前向传播算法是什么样子的.重点会和传统的DNN比较讨论. 1. 回顾CNN的结构 在上一 ...

随机推荐

  1. 在windows上安装不同(两个)版本的Mysql数据库

    1.起因: 需要导入一个sql文件,发现死活导不进去.当执行到这一句时,就有问题.经过一番搜索,原来是我的数据库版本(原先Mysql版本5.5)低了,而支持该语句的版本应该是至少要5.7.那我索性就去 ...

  2. SEO优化上首页之搜索引擎作弊案例与反作弊原理

    搜索引擎流量价值巨大,有不少人专门研究排名机制,利用搜索引擎漏洞作弊,寻求快速提高网站排名,进而获取更多的流量和利益,甚至有的网站优化公司专门提供作弊服务.搜索引擎为了杜绝这种情况,必须能过滤大量垃圾 ...

  3. go语言实战笔记(二)

     码代码之前一定要安装go,哈哈哈哈,反正我只装goland然后写不了代码报错,卡在第一段代码哈哈哈哈哈哈 新建项目goproject 新建src文件夹 新建main文件夹 新建第一个go文件 开始写 ...

  4. Hexo+Github博客搭建

    一.准备 1.安装git 点击下载:链接:https://pan.baidu.com/s/1eToStns 密码:r93r 安装参考之前随笔:http://www.cnblogs.com/jiangb ...

  5. # 2017-2018-1 20155302 课下实践IPC及课上补充

    课上实践补交 题目二要求: 学习使用stat(1),并用C语言实现 提交学习stat(1)的截图 man -k ,grep -r的使用 伪代码 产品代码 mystate.c,提交码云链接 测试代码,m ...

  6. 使用源安装java JDK

    使用下面的命令安装,只需一些时间,它就会下载许多的文件,所及你要确保你的网络环境良好: sudo add-apt-repository ppa:webupd8team/java sudo apt-ge ...

  7. 小白用linode VPS搭建wordpress博客过程备忘 | Linode中文教程

    第一步:装debian系统 1.访问linode官方网站,查看http://library.linode.com/getting-started,我用的是debian系统,用putty登录,升级deb ...

  8. setInterval只执行一次的原因

    setInterval(arrow(),) 改为: setInterval(arrow,) 原因: arrow()这是一个函数调用,函数调用就会有返回值, 而arrow()没有返回值,所以这里的arr ...

  9. 2_C语言中的数据类型 (十)while、for

    1          循环语句 1.1       while while(条件),如果条件为真,循环继续,条件为假,循环结束 while (1)..是死循环的写法 1.2       continu ...

  10. Storm 第四章 Storm常见问题

    1.集群如何启动,任务如何执行? java -server nimbus,supervisor client--->createTopology(序列化)--->提交jar到nimbusi ...