吴恩达老师深度学习视频课笔记:卷积神经网络
计算机视觉:包括图像分类(image classification)、目标检测(object detection)、风格迁移(neural style transfer)等等。
边缘检测示例:神经网络的前几层可以检测边缘,然后后面几层可能检测到物体的部分,接下来靠后的一些层可能检测到完整的物体,如下图示例:
在卷积神经网络术语中,它被称为过滤器(filter),在论文中,有时它被称为核(kernel)而不是过滤器(filter)。卷积运算过程,如下图,用卷积运算实现垂直边缘检测:
更多边缘检测示例:正边、负边其实就是由亮到暗与由暗到亮的区别,即边缘的过渡(edge transitions),如下图:
更多的过滤器,如下图:通过使用不同的过滤器,可以找出垂直或水平的边缘。还有其它过滤器,如Sobel过滤器、Scharr过滤器。一般将垂直过滤器,顺时针翻转90度,就会得到水平过滤器。一般垂直过滤器,左边是正值,中间是0,右边是负值;而一般水平过滤器,上边是正值,中间是0,下边是负值。在深度学习中,你不一定要去使用研究者们推荐的这些过滤器,可以把矩阵中的这9个数字,当成9个参数,并且在之后可以学习使用反向传播算法,其目标就是理解这9个参数,通过反向传播,你可以学习另一种滤波器,这种滤波器对于数据的捕捉能力,甚至可以胜过之前任何的滤波器(单纯的水平边缘和垂直边缘),它可以检测出45度、75度或73度,甚至是任何角度的边缘。
Padding:有一个n*n的图像,用一个f*f的过滤器做卷积,那么输出的结果维即大小就是(n-f+1)*(n-f+1)。按照这种运算会有2个缺点:第一个缺点是每次做卷积操作,你的图像就会缩小,作了几次卷次操作,可能会缩小到1*1的大小;第二个缺点是,边角的像素,这个像素点只会被一个输出所触碰或者使用,但是如果在中间的像素点,就会有许多的区域与之重叠,所以那些在角落或者边缘区域的像素点在输出中采用较少,意味着你丢掉了图像边缘位置的许多信息。为了解决这两个问题,你可以在卷积操作之前填充所处理的图像,可以沿着图像边缘,在填充一层像素,如下图,卷积后会得到和原始图像一样大小的图像。习惯上,你可以用0填充,如果p是填充的数量,那么输出就变成了(n+2p-f+1)*(n+2p-f+1)。
至于选择填充多少个像素,通常有两个选择,分别叫做Valid卷积和Same卷积。Valid卷积意味着不填充(no dapping),即p=0。Same卷积意味着填充后你的输入大小和输出大小是一样的,即p=(f-1)/2,如下图,习惯上,计算机视觉中,f通常是奇数。
卷积步长:如下图,假如输入图像为n*n,过滤器为f*f,padding为p,步长(stride)为s,则输出大小为((n+2p-f)/s+1)*((n+2p-f)/s+1)。如果商不是整数,我们向下取整,即floor函数,这个原则实现的方式是,你只在篮框完全包括在图像或填充完的图像内部时才对它进行运算。如果有任意一个蓝框移动到了外面,那么你就不要进行相乘操作,这是一个惯例。
Convolutions over volumes:在BGR图像上进行卷积操作,如下图,依次取过滤器这27个数,然后乘以相应的红、绿、蓝通道中的数字,然后把这些数加起来,就得到了输出的数。图像的通道数必须和过滤器的通道数一致。过滤器的参数选择不同,你就可以得到不同的特征检测器。按照计算机视觉的惯例,当你的输入有特定的高、宽和通道数时,你的过滤器可以有不同的高、不同的宽,但是必须有一样的通道数。理论上,我们的过滤器,只关注红色通道、或者只关注绿色通道是可行的。
Multiplefilters: 如下图,可以同时使用两个过滤器,其中一个过滤器可能用来检测垂直边缘,另一个过滤器用来检测水平边缘,输出结果为4*4*2。如果你有一个n*n*nc的输入图,然后卷积上一个f*f*nc的过滤器,然后得到一个(n-f+1)*(n-f+1)*n’c的输出,其中n’c为过滤器的个数。在上面这个式子中是假设步长为1并且没有padding。
单层卷积网络:如下图,在6*6的BGR图像上进行卷积操作,有2个3*3*3的过滤器,通过卷积后产生2个4*4的结果,在此结果上加上偏差(bias),再应用非线性激活函数ReLU,再把两个结果矩阵堆叠起来,最终得到一个4*4*2的矩阵。这就是卷积神经网络的一层。
输出图像中的通道数量就是神经网络中这一层所使用的过滤器数量。过滤器中通道的数量必须与输入中通道的数量一致。每个过滤器都有一个偏差参数,它是一个实数。如下图:
简单卷积网络示例:假设有一个卷积网络,用来识别输入的图像中是否含有猫。输入图像的大小为39*39*3,第一层卷积层用3*3的filter来检测特征,stride为1,padding为0,这层共有10个filters,这层输出将是37*37*10。第二层也是卷积层用5*5的filter,stride为2,padding为0,这层共有20个filters,输出将是17*17*20。最后一层卷积层,用5*5的filter, stride为2,这层共有40个filters,输出将是7*7*40,即1960特征,可以将其平滑(flatten)或展开(unroll)成1960个单元,即输出一个长向量,那时和logistic回归或softmax进行计算最终得出神经网络的预测输出,如下图所示。随着神经网络计算深度不断加深,通常开始时图像会较大,高度和宽度会在一段时间内保持一致,然后随着网络深度的加深而逐渐减少,而通道数(numberof channels)在增加。在其它许多卷积神经网络中也有相似操作。
一个典型的卷积网络通常有三种类型的层:一个是卷积层(Convolution),通常用Conv来标注;一个是池化层(Pooling),经常叫做POOL;还有一个是全连接层(Fully connected),用FC表示。虽然仅用卷积层也有可能构建出很好的神经网络,但大部分神经网络架构师依然会添加池化层和全连接层。一般池化层和全连接层比卷积层更容易设计。如下图所示:
池化层:除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性。池化类型有最大池化(maxpooling),如下图所示,在此例中,filter的大小为2,stride位2 ,这两个是最大池化的超参。最大池化运算的实际作用就是:如果在过滤器中提取到某个特征,那么保留其最大值;如果没有提取到某个特征,可能不存在这个特征,那么其中的最大值也还是很小。
计算卷积层输出大小的公式同样适用于最大池化:((n+2p-f)/s)+1,这个公式也可以计算最大池化的输出大小。计算最大池化的方法就是分别对每个通道执行相同的计算过程,nc个通道中每个通道都单独执行最大池化运算。
平均池化:另外一种类型的池化,它不太常用,选取的不是每个过滤器的最大值,而是平均值,如下图所示:
池化的超级参数包括过滤器大小(filter size)和步长(stride)。其中f=2,s=2应该频率比较高,其效果相当于高度和宽度缩减一半。你也可以根据自己的意愿增加表示padding的其它超级参数,但是很少这么用。最大池化时,往往很少用到超级参数padding,当然也有例外情况。最大池化的输入是nh*nw*nc,假设没有padding,输出为((nh-f/s)+1)*((nw-f/s)+1)*nc,如下图所示。需要注意的一点是,池化过程中没有需要学习的参数。反向传播没有参数适用于最大池化。最大池化只是计算神经网络某一层的静态属性。
卷积神经网络示例:假设有一张32*32*3的输入图像,如下图所示,用于手写体数字识别,想识别它是从0到9这10个数字中的哪一个。让我们来构建一个神经网络来实现这个功能。此网络结构和LeNet-5非常相似。假设第一层使用filter大小为5*5,stride为1,padding为0,filter的个数是6,那么输出为28*28*6,将这层标记为CONV1,它有6个filter,增加了bias,应用了非线性函数(激活函数),可能是ReLU,最后输出CONV1的结果。然后构建一个池化层,选用最大池化,超参f=2,s=2,padding=0,最终输出为14*14*6,将这层标记为POOL1。在卷积网络文献中,卷积有两种分类,一类卷积是一个卷积层和一个池化层一起作为一层;另一类卷积是把卷积层作为一层,而池化层单独作为一层。人们在计算神经网络有多少层时,通常只是统计具有权重和参数的层,因此池化层没有权重和参数,只有一些超级参数。这里采用的是把CONV1和POOL1共同作为一个卷积,并标记为Layer1。接着在构建一个卷积层,filter为5*5,stride为1,padding为0,使用16个filter,输出一个10*10*16的矩阵,标记为CONV2,然后最大池化,f=2,s=2,输出为5*5*16的矩阵,标记为POOL2,这是Layer2。现在将POOL2平整化为一个大小为400(即5*5*16)的一维向量。然后利用这400个单元构建下一层。下一层有120个单元,这是第一个全连接层,标记为FC3,此连接层的权重W[3]为(120,400),b[3]为(120,1)。接着再添加一个全连接层,有84个单元,标记为FC4。最后用这84个单元填充一个softmax单元,这个softmax会有10个输出。
在神经网络中,另一种常见模式就是一个或多个卷积层后跟随一个池化层,然后一个或多个卷积层后再跟一个池化层,然后是几个全连接层,最后是一个softmax。
神经网络的激活值形状(activation shape)、激活值大小(activation size)和参数数量:如上例以32*32*3作为输入的神经网络架构,如下图所示:注意事项:(1)、池化层和最大池化层没有任何参数;(2)、卷积层的参数相对较少;(3)、许多参数都存在于神经网络的全连接层;(4)、观察可发现,随着神经网络的加深,激活值size会逐渐变小,如果激活值size下降太快,也会影响网络性能。许多卷积网络都具有这些属性,模式上也相似。
Why convolutions:和只用全连接层相比,卷积层的两个主要优势在于:参数共享(parameter sharing)和稀疏连接(sparsity of connections)。如下图所示:
GitHub:https://github.com/fengbingchun/NN_Test
相关文章:

COCO 2019挑战赛,旷视研究院拿下三项计算机识别冠军 | ICCV 2019
出品 | AI科技大本营(ID:rgznai100)10月27日,两年一度的国际计算机视觉大会ICCV 2019(InternationalConference on Computer Vision)在韩国首尔开幕。作为ICCV 2019重头戏,COCO 是人工智能领域最具影响力的…

runners学习
runners是由salt-run命令调用的,一般我用的到就是jobs和manage模块。源代码是在./site-packages/salt/runners/下的。当然我们可以自定义runners。先谈谈jobs模块。包含active、lookup_jid、list_job、list_jobs、print_job五种方法。salt-run jobs.active ->返回…
Swift基础 - - 高德地图实践
高德地图开发需要自己到官网http://lbs.amap.com/console/ 注册一个ak,新建一个swift工程,然后在Info.plist中添加一个NSLocationAlwaysUsageDescription或者NSLocationWhenInUseUsageDescription。 高德地图的库以及依赖库加入到项目里面 需要的库如下…

Shell脚本示例代码
1. echo_printf_usage.sh: echo和printf的用法 #! /bin/bash# echo和printf的用法# echo是用于终端打印的基本命令.在默认情况下,echo在每次调用后会添加一个换行符 echo "hello, beijing" echo "$(pwd)" echo $(pwd) # 结果并不是希望得到的,将会输出: $…

「2019嵌入式智能国际大会」 399元超值学生票来啦,帮你豪省2600元!
2019 嵌入式智能国际大会即将来袭!购票官网:https://dwz.cn/z1jHouwE物联网是继计算机、互联网和移动通信之后的又一次信息产业的革命性发展,在互联网和移动互联网高速发展的时代,几乎所有行业都有数据联网的需求。无论是国外的科…

ThinkPHP学习笔记之Model操作
2019独角兽企业重金招聘Python工程师标准>>> 1. 3种实例化model模型方法 a) new 命名空间GoodsModel(); b) D([“模型标志Goods”]) (之前版本会实例化自定义model对象,目前都实例化Model基类对象) i. 没有参数实例化一个Model对象、有参数也实例化一…
Ubuntu 14.04 64位上配置JDK操作步骤
1. 从 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 下载jdk-8u172-linux-x64.tar.gz; 2. 解压缩: tar -xvzf jdk-8u172-linux-x64.tar.gz 3. 创建/usr/jdk目录: sudo mkdir -p /usr/jdk 4. 将解压缩后的jd…

Swift语言实现代理传值
需求:利用代理实现反响传值(以下例子采用点击第二个视图控制器中的按钮来改变第一个视图控制器中的Label的内容) 一、创建RootViewController import Foundation import UIKitclass RootViewController:UIViewController,ChangeWordDelegate{…

亚马逊马超:如何使用DGL进行大规模图神经网络训练?
演讲嘉宾 | 马超(亚马逊应用科学家)整理 | 刘静 出品 | AI科技大本营(ID:rgznai100)与传统基于张量(Tensor)的神经网络相比,图神经网络将图 (Graph) 作为输入,从图结构中学习潜在的知…

Python学习系列(六)(模块)
Python学习系列(六)(模块) Python学习系列(五)(文件操作及其字典) 一,模块的基本介绍 1,import引入其他标准模块 标准库:Python标准安装包里的模块。 引入模块的几种方式: i…
Ubuntu14.04 64位上配置终端显示git分支名称
之前在Ubuntu14.04上在终端上显示git分支名称基本上都使用oh-my-zsh,可以参考 https://blog.csdn.net/fengbingchun/article/details/77803322 ,由于限制了权限,使得不能安装oh-my-zsh,显示错误如下:在 https://githu…

创建UITextField对象
//创建UITextField对象 UITextField * tf[[UITextField alloc]init];//设置UITextField的文字颜色tf.textColor[UIColor redColor];//设置UITextField的文本框背景颜色tf.backgroundColor[UIColor grayColor];//设置UITextField的边框的风格tf.borderStyleUITextBorderStyleRou…

non-local神经网络:通过非局部操作解决深度神经网络核心问题
译者 | 李杰出品 | AI科技大本营(ID:rgznai100)回想一下我们熟悉的CNN、RNN。如下图所示,这些神经网络模型都是基于局部区域进行操作,属于local operations。为了获得长距离依赖,也就是图像中非相邻像素点之间的关系&a…

fgets()用法笔记
为了避免缓冲区溢出,从终端读取输入时应当用fgets()代替gets()函数。但是这也将带来一个问题,因为fgets()的调用格式是: fgets (buf, MAX, fp)fgets (buf, MAX, stdin) buf是一个char数组的名称,MAX是字符串的最大长度,…

iOS 上常用的两个功能:点击屏幕和return退出隐藏键盘和解决虚拟键盘
原文地址:http://blog.csdn.net/xiaotanyu13/article/details/7711954 iOS上面对键盘的处理很不人性化,所以这些功能都需要自己来实现, 首先是点击return和屏幕隐藏键盘 这个首先引用双子座的博客 http://my.oschina.net/plumsoft/blog/42545…

深度学习可解释性问题如何解决?图灵奖得主Bengio有一个解
作者 | Yoshua Bengio, Tristan Deleu等译者 | 刘畅,编辑 | Just出品 | AI科技大本营(ID:rgznai100)自 2012 年以来,深度学习的发展有目共睹,今年 3 月,为此做出巨大贡献的 Yoshua Bengio、Yann Lecun和Geo…

zepto打造一款移动端划屏插件
效果图 样式1 样式2 调用 正常情况下应该是后台生成的html代码,但还是写了一套操作tab页的方法 调用简便如下: <link rel"stylesheet" href"kslider.css" type"text/css"/> <script type"text/javascript&q…
swift使用xib绘制UIView
目标:用xib绘制一个UIView,在某个ViewController中调用。 三个文件:ViewController.swift DemoView.swift DemoView.xib 首先,可以专心将DemoView.xib画出来,别忘记DemoView.xib中UIView的一处设置 然后&#x…
吴恩达老师深度学习视频课笔记:深度卷积网络
Why look at case studies?:过去几年,计算机视觉研究中的大量研究都集中在如何把卷积层、池化层以及全连接层这些基本构件组合起来形成有效的卷积神经网络。找感觉最好的方法之一就是去看一些案例,就像很多人通过看别人的代码来学习编程一样…
测试工程师的好日子来啦?Testin发布AI测试产品,提升易用性和自动化效率
2019年10月26日,以"AI未来"为主题的第二届NCTS中国云测试行业峰会在北京国际会议中心正式开幕。在本次大会上,Testin 总裁徐琨正式发布测试业务Testin云测的全新AI产品iTestin。作为 Testin 人工智能战略中的重要一环,iTestin 融合…

Discuz DB层跨库映射关系表名前缀BUG修复后产生的新bug
新的逻辑引入了新的bug,会导致在跨多库连接时,产生表名前缀映射混乱,需要再做逻辑上的修复。 function table_name($tablename) {if(!empty($this->map) && !empty($this->map[$tablename])) {$id $this->map[$tablename];…

swift语言的Block
[cpp] view plaincopy// // blockDemo.swift // swiftDemo // // Created by apple on 14-6-29. // Copyright (c) 2014年 fengsh. All rights reserved. // import Foundation //无参无返回值 typealias funcBlock () -> () //或者 () -> …
吴恩达老师深度学习视频课笔记:目标检测
目标定位:如下图,图像分类任务就是算法遍历图像,判断其中的对象是不是car。图像定位分类(classification with localization)不仅要用算法判断图像中的是不是car,还要在图像中标记出car的位置。图像分类的思路可以帮助学习分类定位࿰…

国际顶级学界业界大咖云集,9 场技术论坛布道,2019 嵌入式智能国际大会强势来袭!...
2019 嵌入式智能国际大会即将来袭!购票官网:https://dwz.cn/z1jHouwE2019年12月6日-8日,2019嵌入式智能国际大会将在深圳华侨城洲际大酒店举行。本次大会由哈尔滨工业大学(深圳)、清华大学国际研究生院、CSDN、嵌入式视…

Linux简介总结
1. Linux 就是Unix, 但是Unix 并不一定是Linux.2. 三种软件模式:商业软件,共享软件,自由软件。3. 为什么使用Linux? 它是一个自由软件。第一:可免费提供给任何用户使用。第二:它的源代码公开和可自…

Swift中编写单例的正确方式
本文由CocoaChina译者leon(社区ID)翻译自krakendev 原文:THE RIGHT WAY TO WRITE A SINGLETON 转载请保持所有内容和链接的完整性。 在之前的帖子里聊过状态管理有多痛苦,有时这是不可避免的。一个状态管理的例子大家都很熟悉,那就是单例。使…
C语言中的弱符号与强符号介绍
弱符号(Weak symbol)是链接器(ld)在生成ELF(Executable and Linkable Format,缩写为ELF,可执行和可链接格式,是一种用于可执行文件、目标文件、共享库和核心转储的标准文件格式。ELF文件有两种索引:程序标头中记载了运行时所需的段࿰…

Simple Transformer:用BERT、RoBERTa、XLNet、XLM和DistilBERT进行多类文本分类
作者 | Thilina Rajapakse译者 | Raku编辑 | 夕颜出品 | AI科技大本营(ID: rgznai100)【导读】本文将介绍一个简单易操作的Transformers库——Simple Transformers库。它是AI创业公司Hugging Face在Transformers库的基础上构建的。Hugging Face Transfor…
StarUML中时序图添加小人
转载于 http://blog.csdn.net/longyuhome/article/details/9011629 在看时序图的例子的时候,发现有些的时序图上有小人的图标,可是一些UML工具却没有找到小人的图标,这让我很闹心,一直没解决,今天终于将该问题给解…

Swift学习: 从Objective-C到Swift
作者:方秋枋(GitHub) 这篇文章是自己学习Swift的笔记与深化。希望这篇文章能够帮助已经有Objective-C经验的开发者更快地学习Swift。同时也品味到Swift的精妙之处。 结论放在开头:我认为Swift比Objective-C更优雅,更安全同时也更现代,更性感…