1 边缘检测( edage detection )

下图是垂直边缘检测的例子,实际上就是用一个卷积核进行卷积的过程。

这个例子告诉我们,卷积可以完成垂直方向的边缘检测。同理卷积也可以完成水平方向的边缘检测,还可以完成各种不同角度的边缘检测。

计算机视觉的研究者会用几种不同的卷积核来做边缘检测。

但是在深度学习时代,我们不需要使用那些卷积核,我们把卷积核的数字设置成参数,通过训练来学习到不同的卷积核, 以此对图像进行处理,抽取相应的特征。

2 padding和步长( padding, stride )

如果采用上述的方法进行卷积,那么图像会缩小,而且原图的边缘信息在卷积中的参与度比较少,我们可以使用padding来解决这个问题,即在外围填充像素,比如填充0。

padding的参数p,表示在外围填充了几层。填充了p层,则原图像的高和宽都会增加2*p,因为会在两边填充所以是2*p。

一个n*n的图像,padding为p,在f*f的卷积核的卷积下,卷积后的图像为 ( n + 2p - f + 1) * ( n + 2p - f + 1 )。

valid convolution:没有padding的卷积。

same convolutioin:设定了padding使得卷积后图像大小不变的卷积,即 n = n+2p-f+1,那么p = ( f - 1 ) / 2,所以为了保证p为整数,一般f都为奇数。

stride决定了卷积核每次移动的步长,假定步长参数为s,每次移动s步。

一个n*n的图像,f*f的卷积核,padding为p,stride为s,卷积后的图像size为 ( n + 2p - f ) / s + 1,为了防止小数,应该向下取整$\left \lfloor ( n + 2p - f ) / s + 1 \right \rfloor$,表示卷积核在某个方向上无法继续移动。

3 三维卷积( Convolutions over volumes )

考虑到图像的3通道,这个时候的卷积核也应该是3通道的,卷积运算的时候把3个通道的结果加起来作为结果,剩下的就和之前的卷积没什么差别。

再考虑多个卷积核的情况,用#filter表示卷积核个数,则卷积后的图像可以看成#filter层的图像,每一层是单个卷积核卷积后的结果,单个卷积核的通道是3。

用nc表示通道数,用nc' 表示卷积核的数目,那么原始图片是n * n * nc,卷积核是f * f * nc,则卷积后的图片为 (n - f + 1) * ( n - f + 1) * nc'。这里默认p为0,s为1,如果不是则参考之前的计算公式$\left \lfloor ( n + 2p - f ) / s + 1 \right \rfloor$。

4 卷积网络( convolutional network )

在神经网络中,在对原图像卷积后我们还要做一些运算,卷积可以看成wx的运算,我们还要加上偏置b,以及激活的运算。

先考虑单层卷积网络,如下图所示,输入图像为6*6*3的矩阵。

用第1个卷积核对输入矩阵卷积,用卷积得到的矩阵加上一个偏置b1(python会将它广播成shape为4*4的矩阵),用relu激活,得到一个4*4的矩阵。

用第2个卷积核对输入矩阵卷积,用卷积得到的矩阵加上一个偏置b2,用relu激活,得到另一个4*4的矩阵。

把这个两个矩阵堆叠起来,形成4*4*2的矩阵,作为单元的输出。

卷积核的大小3*3*3,加上1个偏置,等于28,然后乘以卷积核的个数2,就是56,这就是该卷积层的参数个数。

不管你的图有多大,需要的参数个数都是一样的,这是卷积神经网络的一个特点,可以防止过拟合。

做下符号约定,$f^{[l]}$表示l层的卷积核大小(边长),$p^{[l]}$表示l层的padding,$s^{[l]}$表示l层的stride,$nc^{[l]}$表示l层的卷积核个数。

5 池化层( Pooling layers )

最大池化就是把矩阵分成几块,比如4*4就分成4个2*2的块,每个块取最大的值作为该块的值,形成一个2*2的矩阵。

这里参数f为2,表示2*2,参数s为2,表示移动2格。有点类似卷积的操作,只是用最大化代替了卷积运算。

可以把4*4看成某些特征的集合,数字大意味着可能提取了某个特定特征,比如左上象限存在的这个特征9,可能是一个猫的眼睛,而右上象限就没有这个特征。

最大化的实际作用就是,只要在任何一个象限提取到了某个特征,它就会被保留在最大池化的输出里。

如果在过滤器中提取到某个特征,那么保留了一个较大的数字,如果没有提取到这个特征,可能在右上象限不存在这个特征,那么其中的最大值也还是很小。

池化从二维推到三维就只是简单地叠加一层层的矩阵,每层还是按二维的池化那样做,没什么变化,输入是几通道,输出就是几通道。

平均池化和最大池化类似,就是最大化操作变成了取平均操作,目前来说,最大池化比平均池化更常用。

你可以根据自己意愿添加padding参数,只不过,最大池化中很少用padding。

6 卷积神经网络的示例( Convolutional neural network example )

一个典型的卷积神经网络就是(卷积1,池化1,卷积2,池化2,..,压平,全连接)。

可以直接把卷积和池化看成一类卷积操作,那整个过程其实就是进行多次的卷积,压平,然后接1层或几层全连接,最后接输出层。

这是典型的卷积神经网络结构,里面有很多超参数,常规做法是,尽量不要自己设置超参数,而是查看文献,选一个在别人任务中效果很好的架构。

如下图所示,可以看到图像的大小会越来越小,但是通道会越来越大。

7 为什么要卷积( Why convolutions)

卷积有两个重要的性质,一个是权值共享,一个是稀疏连接。正是因为这两个性质,卷积减少了很多参数,防止了过拟合。

权值共享很好理解,对于图像的每一部分都使用卷积核,卷积核就是共享的权值。卷积核在图像的一部分发挥了作用,那么在其它部分也能发挥作用。

稀疏连接就是每一层的输出只依赖于部分的输入,就是卷积的时候,一个输出是由图像的一部分卷积而来的。相比于全连接层,它减少了很多连接。

ng-深度学习-课程笔记-11: 卷积神经网络(Week1)的更多相关文章

  1. 深度学习课程笔记(一)CNN 卷积神经网络

    深度学习课程笔记(一)CNN 解析篇 相关资料来自:http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML17_2.html 首先提到 Why CNN for I ...

  2. 深度学习课程笔记(十八)Deep Reinforcement Learning - Part 1 (17/11/27) Lectured by Yun-Nung Chen @ NTU CSIE

    深度学习课程笔记(十八)Deep Reinforcement Learning - Part 1 (17/11/27) Lectured by Yun-Nung Chen @ NTU CSIE 201 ...

  3. 深度学习课程笔记(十二) Matrix Capsule

    深度学习课程笔记(十二) Matrix Capsule with EM Routing  2018-02-02  21:21:09  Paper: https://openreview.net/pdf ...

  4. 深度学习课程笔记(十一)初探 Capsule Network

    深度学习课程笔记(十一)初探 Capsule Network  2018-02-01  15:58:52 一.先列出几个不错的 reference: 1. https://medium.com/ai% ...

  5. 深度学习课程笔记(五)Ensemble

    深度学习课程笔记(五)Ensemble  2017.10.06 材料来自: 首先提到的是 Bagging 的方法: 我们可以利用这里的 Bagging 的方法,结合多个强分类器,来提升总的结果.例如: ...

  6. 深度学习课程笔记(四)Gradient Descent 梯度下降算法

    深度学习课程笔记(四)Gradient Descent 梯度下降算法 2017.10.06 材料来自:http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLDS1 ...

  7. 深度学习课程笔记(三)Backpropagation 反向传播算法

    深度学习课程笔记(三)Backpropagation 反向传播算法 2017.10.06  材料来自:http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLDS1 ...

  8. TensorFlow 2.0 深度学习实战 —— 浅谈卷积神经网络 CNN

    前言 上一章为大家介绍过深度学习的基础和多层感知机 MLP 的应用,本章开始将深入讲解卷积神经网络的实用场景.卷积神经网络 CNN(Convolutional Neural Networks,Conv ...

  9. 深度学习课程笔记(十七)Meta-learning (Model Agnostic Meta Learning)

    深度学习课程笔记(十七)Meta-learning (Model Agnostic Meta Learning) 2018-08-09 12:21:33 The video tutorial can ...

随机推荐

  1. 微信jssdk批量添加卡券接口(踩坑经验)

    1)首先是官方接口文档: 1.批量添加卡券接口:https://mp.weixin.qq.com/wiki?action=doc&id=mp1421141115&t=0.0861973 ...

  2. Unity中Oculus分屏相机和普通相机一键切换

    Unity中Oculus分屏相机和普通相机一键切换 一.OCulus 分屏相机介绍 在VR开发工程中,总会觉得OC分屏的处理太慢,严重浪费时间啊! 但是不使用有不好调试,来回切换相机就成为了一个必须. ...

  3. 当inline-block或者float失效的时候怎么弄

    当我们想要元素水平排列的时候,inline-block或者float是最好的选择了,但是当父元素的宽高都设置了的时候,子元素会失效,如下: 代码: <!DOCTYPE html> < ...

  4. Spring学习笔记--注入Bean属性

    这里通过一个MoonlightPoet类来演示了注入Bean属性property的效果. package com.moonlit.myspring; import java.util.List; im ...

  5. PyQt4发射信号

    继承自QtCore.QObject的对象均可以发射信号.如果我们单击一个按钮,那么一个clicked()信号就会被触发.下面的示例演示如何手动发射一个信号. #!/usr/bin/python # - ...

  6. LeetCode——Implement Queue using Stacks

    Description: Implement the following operations of a queue using stacks. push(x) -- Push element x t ...

  7. 学习坤哥的replaceTpl方法

    学习坤哥的方法之后自己写的replaceTpl function replaceTpl(tpl, data){///////////////没有传入可让用户自己定义的方式进行替换,不够灵活       ...

  8. js 数组函数

    Array.prototype.join Array.prototype.reverse Array.prototype.sort Array.prototype.concat Array.proto ...

  9. dubbo用途介绍

    转自:http://blog.csdn.net/wuliu_forever/article/details/52053928 我们讨论过Nginx+tomcat组成的集群,这已经是非常灵活的集群技术, ...

  10. Andorid- 反序列化,采用pull解析 xml 文件

    MainActivity.java 主入口,通过获得 XML文件 ,然后将解析后的文件标签以及文本内容拼接到 StringBuffer中,最后显示在TextView上 package com.exam ...