过滤器(卷积核)

传统的图像过滤器算子有以下几种:

  • blur kernel:减少相邻像素的差异,使图像变平滑。
  • sobel:显示相邻元素在特定方向上的差异。
  • sharpen :强化相邻像素的差异,使图片看起来更生动。
  • outline:也称为edge kernel,相邻像素相似亮度的像素点设成黑,有较大差异的设为白。

更多可参考 image-kernels 在线演示不同的卷积过滤器。

CNN 卷积层

CNN做的事情不是提前决定好过滤器,而是把过滤器当成参数不断调整学习,学出合适的过滤器。卷积网络的第一层执行的通常都是边缘检测,后面的层得到的都是更抽象的特征。CNN 卷积层的一个重要特性是权值共享.

权值共享:不同的感受域共享同一权值,因此也称为filter,能够大大减少权重的数量(所占的内存),这通常是有效的,因为filter过滤某一特征与具体的空间位置无关.但无独有偶,人脸图片通常是中心化的,即人的脑袋比较靠近中间,如此可以看出位置信息是有用的.对于这种情形我们可以取消权值共享机制,此时称这一层为Locally-Connected Layer.

有时候提到filter的长和宽大小而不提到深度,则深度是输入数据的整个深度(因此1x1的卷积核也是有意义的).如前一层的输入是 [16x16x20],感知域大小是3x3,那么卷积层中每个神经元将有3x3x20 = 180个到前一层的连接.
如果指明了深度,如96,那么卷积层中每个神经元到前一层有3x3x96个连接,96层连接到同一块区域,但是权重不相同.(注意有时候还以RGB三通道这三层作为一个整体,因此还要乘上3).

小卷积核

现在流行的网络结构设计多遵循小卷积核的设计原则, 小卷积核的优势:
3个3x3的卷积核的累加相当于1个7x7的卷积核,但是参数更少,计算量更小,有更多的非线性层计算.还可以通过加入1x1的"bottleneck"卷积核进一步减少计算(GoogLeNet等大量运用这种方式加深层次).如输入HxWxC经过下列步骤输出的维数不变:
\[
\require{AMScd}
\begin{CD}
H\times W\times C @>{\text{C/2 x Conv1x1}}>> H\times W\times C/2 \\
@. @V {\text{C/2 x Conv3x3}} VV \\
H\times W\times C @< \text{C x Conv1x1} << H\times W\times C/2
\end{CD}
\]
然而上述步骤中仍然使用了3x3卷积核,可以将其转成1x3与3x1的连接.

Dilated convolutions.卷积核在输入上滑动时可以让步长大到不同的感知域之间有间隙,这个间隙作为超参数(dilation膨胀).其作用相当于减少了一些卷积等层,更快地获取输入的空间信息.

卷积实现

卷积有三种主流的计算方式:转化为矩阵乘,winograd,和FFT。

在现代的 DL 框架中对卷积计算通常采用矩阵乘法的方式,使用im2col操作将输入数据与权重展开成二维矩阵(使得图像矩阵和卷积核能够直接相乘, 转换的反向操作为col2im),运用 BLAS API进行高效计算,缺点是占用许多内存.这种思想也可以用在pooling操作中.

没有广泛使用FFT的原因:
FFT只有在卷积核比较大的时候才有明显速度优势。但是CNN的卷积核一般都小于5,所以深度学习中一般不用FFT。FFT卷积没有广泛应用的原因是因为通用平台上有更合适的Winograd卷积的存在,而专用平台上直接降低运算精度是更合适的方案。不过,现在CNN里面越来越多的1×1卷积和depthwise卷积被加入,Winograd卷积的价值也越来越小了。1

下边简单介绍下快速傅里叶变换.

卷积定理(convolution theorem) 23

快速傅里叶变换被称为20世纪最重要的算法之一, 一个因素就是卷积定理.
傅里叶变换可以看作是对图像或者音频等数据的重新组织,它将时域和空域上的复杂卷积对应到了频域中的元素间简单的乘积。
一维连续域上两个连续函数的卷积:

\[
h(x)=f\bigotimes g=\int_{-\infty}^\infty f(x-u)g(u)du=\mathcal F^{-1}(\sqrt{2\pi}\mathcal F[f]\mathcal F[g])
\]

由卷积定理可以知道,两个矩阵卷积的结果等价于两个矩阵经过傅里叶变换(\(\mathcal F\)),进行元素级别相乘,再经过傅里叶逆变换(\(\mathcal F^{-1}\)). \(\sqrt{2\pi}\)是一个normalizer.

二维离散域(图像)上的卷积:

\[
\begin{align}
\text{feature map}=&\text{intput}\bigotimes\text{kernel} \\
=&\sum_{y=0}^M \sum_{x=0}^N \text{intput}(x-a,y-b)\cdot \text{kernel}(x,y) \\
=&\mathcal F^{-1}(\sqrt{2\pi}\mathcal F[\text{intput}]\mathcal F[\text{kernel}])
\end{align}
\]

快速傅里叶变换是一种将时域和空域中的数据转换到频域上去的算法。傅里叶变换用一些正弦和余弦波的和来表示原函数。必须注意的是,傅里叶变换一般涉及到复数,也就是说一个实数被变换为一个具有实部和虚部的复数。通常虚部只在一部分领域有用,比如将频域变换回到时域和空域上.
傅里叶变换图示4

从傅里叶变换中可以看出方向信息:

Images by Fisher & Koryllos (1998). Source

caffe中的卷积实现

卷积操作示意图如下,输入图片的维数为[c0,h0,w0];卷积核的维数为[c1,c0,hk,wk],其中c0在图中没有表示出来,一个卷积核可以看成由c1个维数为[c0,hk,wk]的三维滤波器组成,输出特征的维数为[c1,h1,w1]

转成二维矩阵乘法的高效计算:

更详细的im2col图示:

深度学习-conv卷积的更多相关文章

  1. 深度学习之卷积神经网络(CNN)的应用-验证码的生成与识别

    验证码的生成与识别 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10755361.html 目录 1.验证码的制 ...

  2. 深度学习之卷积神经网络CNN及tensorflow代码实例

    深度学习之卷积神经网络CNN及tensorflow代码实例 什么是卷积? 卷积的定义 从数学上讲,卷积就是一种运算,是我们学习高等数学之后,新接触的一种运算,因为涉及到积分.级数,所以看起来觉得很复杂 ...

  3. 深度学习之卷积神经网络CNN及tensorflow代码实现示例

    深度学习之卷积神经网络CNN及tensorflow代码实现示例 2017年05月01日 13:28:21 cxmscb 阅读数 151413更多 分类专栏: 机器学习 深度学习 机器学习   版权声明 ...

  4. 【神经网络与深度学习】卷积神经网络(CNN)

    [神经网络与深度学习]卷积神经网络(CNN) 标签:[神经网络与深度学习] 实际上前面已经发布过一次,但是这次重新复习了一下,决定再发博一次. 说明:以后的总结,还应该以我的认识进行总结,这样比较符合 ...

  5. 深度学习之卷积神经网络(CNN)详解与代码实现(一)

    卷积神经网络(CNN)详解与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10430073.html 目 ...

  6. 【转载】 深度学习之卷积神经网络(CNN)详解与代码实现(一)

    原文地址: https://www.cnblogs.com/further-further-further/p/10430073.html ------------------------------ ...

  7. 深度学习之卷积神经网络(CNN)

    卷积神经网络(CNN)因为在图像识别任务中大放异彩,而广为人知,近几年卷积神经网络在文本处理中也有了比较好的应用.我用TextCnn来做文本分类的任务,相比TextRnn,训练速度要快非常多,准确性也 ...

  8. 深度学习:卷积神经网络(convolution neural network)

    (一)卷积神经网络 卷积神经网络最早是由Lecun在1998年提出的. 卷积神经网络通畅使用的三个基本概念为: 1.局部视觉域: 2.权值共享: 3.池化操作. 在卷积神经网络中,局部接受域表明输入图 ...

  9. 深度学习FPGA实现基础知识10(Deep Learning(深度学习)卷积神经网络(Convolutional Neural Network,CNN))

    需求说明:深度学习FPGA实现知识储备 来自:http://blog.csdn.net/stdcoutzyx/article/details/41596663 说明:图文并茂,言简意赅. 自今年七月份 ...

随机推荐

  1. 2.4、Android Studio使用主题编辑器设计主题

    Android Studio包含一个叫主题编辑器的可视的助手,可以提供以下功能: 1. 创建和更改你的app主题 2. 为不同的资源适应主题 3. 普通的UI颜色更改的实时显示 主题编辑器 这一节描述 ...

  2. [maven学习笔记]第一节,认识maven,搭建maven开发环境,写第一个HelloWorld

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/40142771 maven官网:http://maven.apache.org/ 学习视 ...

  3. SSH网上商城---使用ajax完成用户名是否存在异步校验

    小伙伴在上网的时候,需要下载或者观看某些视频资料,更或者是在逛淘宝的时候,我们都需要注册一个用户,当我们填写好各种信息,点击确定的时候,提示用户名已经存在,小编就想,为什么当我们填写完用户名的时候,她 ...

  4. C++对象模型的那些事儿之一:对象模型(上)

    前言 很早以前就听人推荐了<深入理解C++对象模型>这本书,从年初买来到现在也只是偶尔翻了翻,总觉得晦涩难懂,放在实验室上吃灰吃了好久.近期由于找工作对C++的知识做了一个全面系统的学习, ...

  5. android 特卖列表倒计时卡顿问题

    在Android的开发中,我们经常遇见倒计时的操作,通常使用Timer和Handler共同操作来完成.当然也可以使用Android系统控件CountDownTimer,这里我们封装成一个控件,也方便大 ...

  6. 《java入门第一季》之集合框架TreeSet存储元素自然排序以及图解

    这一篇对TreeSet做介绍,先看一个简单的例子: * TreeSet:能够对元素按照某种规则进行排序.  * 排序有两种方式  * A:自然排序: 从小到大排序  * B:比较器排序    Comp ...

  7. JAVA中的静态成员

    //Java中的静态成员 /* *静态的成员变量是属于类的,不属于某个对象,是共享的. * 访问时可以用类名.静态属性直接访问,也可以用对象.访问,后者不提倡. * 静态的成员方法只能访问静态的成员 ...

  8. Web Service进阶(二)如何用Apache TCPMon来截获SOAP消息

    注:以下是关于TCPMon的一些使用常识,如果不需要或是已经熟悉就不用往下看了. 在WebService服务器和客户机之间会传递SOAP消息,有时我们需要得到这些消息以便调试,而Apache的TCPM ...

  9. JAVA之旅(二十五)——文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine

    JAVA之旅(二十五)--文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine 我们继续IO上个篇 ...

  10. Unity UGUI基础之Text

    Text作为UGUI最基础的控件以及最常用的控件,它在项目中的应用绝对可以算是最多的,任何一个UI界面可以说都离不开它,它的基本属性如下: 一.rect transform组件: rect trans ...