Tensorflow快餐教程(9) - 卷积

摘要: 卷积的计算方法

卷积

卷积就是滑动中提取特征的过程

在数学中,卷积convolution是一种函数的定义。它是通过两个函数f和g生成第三个函数的一种数学算子,表征函数f与g经过翻转和平移的重叠部分的面积。其定义为:
h(x)=f(x)g(x)=f(t)g(xt)dth(x)=f(x)∗g(x)=∫−∞∞f(t)g(x−t)dt

也可以用星号表示:h(x)=(fg)(x)h(x)=(f∗g)(x)
卷积的第一个参数(上例中的f),通常叫做输入。第二个参数(函数g)叫做核函数kernel function。输出有时候叫特征映射feature map.

也可以定义离散形式的卷积:
h(x)=(fg)(x)=t=f(t)g(xt)h(x)=(f∗g)(x)=∑t=−∞∞f(t)g(x−t)

g(x-t)是变化的,而f(t)是固定不动的。我们可以将卷积理解成是g(x-t)滑动过程中对f(t)进行采样。

我们一般可以用f(x)=wx+bf(x)=wx+b来作为核函数提取特征

我们来举个小例子说明一下卷积对于特征提取的过程。

假设有一个5*5的矩阵做为输入:

array([[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.]], dtype=float32)

y=wx+b我们取w为3*3的全1矩阵,b=0。
这样我们计算左边第一个3*3的小块,得11+11+11+11+11+11+11+11+11=91∗1+1∗1+1∗1+1∗1+1∗1+1∗1+1∗1+1∗1+1∗1=9
以此类推,最后我们得到一个
[[9,9,9],
[9,9,9],
[9,9,9]]
的矩阵。
相当于我们把一个55的黑白矩阵压缩成了33的灰度矩阵。

全是1的话大家看不太清楚,我们选一个对角矩阵再来计算一下:

array([[1., 0., 0., 0., 0.],[0., 1., 0., 0., 0.],[0., 0., 1., 0., 0.],[0., 0., 0., 1., 0.],[0., 0., 0., 0., 1.]], dtype=float32)

计算卷积之后的结果为:

[[3,2,1],
[2,3,2],
[1,2,3]]

图像缩小了之后,仍然是主对角线最黑。基本特征还是被提取出来了。

填充Padding

从前面对角线的例子可以看出,由于图片中间的点被计算的次数多,而边缘上的点计算的次数少,所以明明右上角和左下角都是0,提取完特征之后被中间的1给影响了。
我们可以选择给这个55的矩阵外边加上一圈padding,将其变成77的矩阵。

我们再重新计算一下卷积,获取下面一个5*5的新矩阵:

[[2,2,1,0,0],[2,3,2,1,0],[1,2,3,2,1],[0,1,2,3,2],[0,0,1,2,2]]

这样边缘的0就被识别出来了。Padding的最主要作用就是让边界变得更清晰。

步幅Stride

上面我们求卷积的时候,每次向右移到一步,这个移动距离就是Stride。
比如我们想把图片压缩得更狠一点,取得更高的压缩率,我们就可以加大步幅。

卷积用Tensorflow实现

上面知识储备已足,我们开始用Tensorflow来计算卷积吧。

首先是输入,按照Tensorflow的要求,我们得把5*5的,resize成[1,5,5,1]格式的,如下:

>>> c
array([[[[1.],[0.],[0.],[0.],[0.]],[[0.],[1.],[0.],[0.],[0.]],[[0.],[0.],[1.],[0.],[0.]],[[0.],[0.],[0.],[1.],[0.]],[[0.],[0.],[0.],[0.],[1.]]]], dtype=float32)

然后我们还需要准备卷积核,先生成一个3*3全1矩阵:

>>> a2 = sess.run(tf.ones([3,3]))
>>> a2
array([[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]], dtype=float32)

然后将其reshape成[3,3,1,1]格式的:

>>> a3 = sess.run(tf.reshape(a2,[3,3,1,1]))
>>> a3
array([[[[1.]],[[1.]],[[1.]]],[[[1.]],[[1.]],[[1.]]],[[[1.]],[[1.]],[[1.]]]], dtype=float32)

步幅我们设成[1,1,1,1],其实就是x轴1,y轴1,前面和后面的1先不用管它。padding设成'SAME':

>>> a1 = tf.nn.conv2d(c,a3,strides=[1,1,1,1],padding='SAME')
>>> sess.run(a1)
array([[[[2.],[2.],[1.],[0.],[0.]],[[2.],[3.],[2.],[1.],[0.]],[[1.],[2.],[3.],[2.],[1.]],[[0.],[1.],[2.],[3.],[2.]],[[0.],[0.],[1.],[2.],[2.]]]], dtype=float32)

结果看起来不爽的话,我们再重新将其reshape成[5,5]的:

>>> a5 = tf.reshape(a4,[5,5])                               
>>> sess.run(a5)
array([[2., 2., 1., 0., 0.],[2., 3., 2., 1., 0.],[1., 2., 3., 2., 1.],[0., 1., 2., 3., 2.],[0., 0., 1., 2., 2.]], dtype=float32)

嗯,是不是跟我们手动计算的一样呢?恭喜你,已经学会卷积啦!

池化层

池化层跟卷积也很像,但是计算要简单得多。池化主要有两种,一种是取最大值,一种是取平均值。而卷积是要做矩阵内积运算的。

我们以2*2最大池化为例,处理一下上节加了padding的卷积

[[2,2,1,0,0],[2,3,2,1,0],[1,2,3,2,1],[0,1,2,3,2],[0,0,1,2,2]]

最大池化就是取最大值,比如[[2,2],[2,3]]就取3。结果如下:

[[3,3,2,1],[3,3,3,2],[2,3,3,3],[1,2,3,3,]]

可以看到,池化虽然进一步丢失了信息,但是基本规律还是不变的。

池化被认为可以提高泛化性,对于微小的变动不敏感。比如对于少量的平移,旋转或者缩放保持同样的识别。但是,池化层不是必须的。

在Tensorflow中,可以用tf.nn.max_pool来实现最大池功能。

首先我们要把图片resize成(-1,高,宽,1)这样格式的:

>>> b = tf.reshape(a,[-1,5,5,1])
>>> c = sess.run(b)
array([[[[1.],[0.],[0.],[0.],[0.]],[[0.],[1.],[0.],[0.],[0.]],[[0.],[0.],[1.],[0.],[0.]],[[0.],[0.],[0.],[1.],[0.]],[[0.],[0.],[0.],[0.],[1.]]]], dtype=float32)

然后我们用步幅为2。2*2窗口计算max pooling。
命令如下:

d =tf.nn.max_pool(c,ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')

四元组中我们不必管第一个和最后一个,中间两个是高和宽。ksize和步幅皆如此。
运行结果是一个3*3的对角阵:

>>> sess.run(d)
array([[[[1.],[0.],[0.]],[[0.],[1.],[0.]],[[0.],[0.],[1.]]]], dtype=float32)

卷积网络的结构

卷积神经网络也叫卷积网络,是一种善于处理网格数据的网络。典型应用是处理一维网格数据语音和二维网格数据图像。只要是在网络结构中使用了哪怕一层的卷积层,就叫做卷积神经网络。

与之前介绍的神经网络都是全连接网络,即每一层的每个节点都是上一层的所有节点相连接。
而卷积网络一般是五种连接结构的组合:

  1. 输入层:一般认为就是原图片
  2. 卷积层:与全连接网络不同,卷积层中每一个节点的输入只是上一层神经网络的一小块,常用的块大小为33或者55。一般来说,通过卷积层处理过的节点的矩阵的深度会变深
  3. 池化层:Pooling层不会改变矩阵的深度,但是会使矩阵变小。可以理解为池化层是把高分辨率的图片转化成低分辨率的图片
  4. 全连接层:最后的分类工作一般还是由一至两个全连接层来实现的。
  5. Softmask层:可以得到当前样例属于不同分类的概率情况

卷积网络简史

上节深度学习简史中我们提到过,第一个卷积网络模型于1989年由Yann LeCun提出。卷积网络的主要概念如为什么要卷积,为什么要降采样,什么是径向基函数RBF(Radial Basis Function)等。

10年后的1998年,Yann LeCun设计了LeNet网络。在论文《Gradient-Based Learning Applied to Document Recognition》中提出了LeNet-5的模型,结构如下:

论文原文在:http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf

但是,正如我们前面介绍的,当时还是SVM辉煌的时代。
转折点要到十几年后的2012年,Hinton的学生Alex Krizhevsky发明的AlexNet之时。AlexNet在2012年的图像分类竞赛中将Top-5错误率从上一年的25.8%降到15.3%.

AlexNet成功之后,大家的研究热情空前高涨。主要方向有网络加深和功能增强。

  1. 网络加深:深度学习的优势就是突破了加深层数的关键点。那么就可以构建比AlexNet层数更多的网络。代表作是2014年ImageNet比赛的亚军牛津大学的VGGNet,它的层数可以达到16~19层。从而将Top-5错误率从AlexNet的15.3%降到了7.32%.
  2. 功能增强:代表作是GoogLeNet。GoogLeNet参考了NIN(Network In Network)的思想,将原来的线性卷积层改成了多层感知机。同时,将全连接层改进为全局平均池化。功能增强之后,GoogLeNet力压VGGNet,获得2014年ImageNet的冠军,将Top-5错误率降到6.67%. 虽然功能有增强,但是在层数上GoogLeNet也毫没客气地增加到22层。后来在GoogLeNet的基础上又推出Inception V3, V4等网络。
  3. 既加深也增强:代表作是2015年的ImageNet分类冠军,由微软亚洲研究院发明的ResNet残差网络。ResNet在2015年的成绩把错误率降到3.57%.

话说ImageNet真是个群英荟萃的地方。2012年第一名是Alex。2013的第一名是Matthew Zeiler,之前讲过他提出的AdaGrad。
值得一提的是,在最近几年的ImageNet中,华人屡创佳绩。比如2016年的冠军被公安部第三研究所搜神团队获得,成绩是错误率2.99%。


作者:lusing

原文链接

本文为云栖社区原创内容,未经允许不得转载。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521784.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

商家笑了 设计师哭了,京东+英特尔的AI这招太绝

戳蓝字“CSDN云计算”关注我们哦!作者 | 刘丹出品 | CSDN云计算(ID:CSDNcloud)在如今“无促销不电商”的大环境熏陶下,商家需要榨干了脑浆想尽各种奇招,玩法虽多,但万变不离其宗。面对上万、甚至…

明显调用的表达式前的括号必须具有指针函数类型_每天三分钟带你搞懂C++基础Day5 处理类型 typedef、auto、decltype...

类型别名(type alias)一个名字,是某种类型的同义词。使用类型名有很多好处,能让复杂的类型名字变得简单明了,易于理解和使用。有两种方法可用于定义类型别名。传统的方法是使用关键字typedef :typedef double wages; //wages是double的同义词…

基于OGG Datahub插件将Oracle数据同步上云

摘要:随着数据规模的不断扩大,传统的RDBMS难以满足OLAP的需求,本文将介绍如何将Oracle的数据实时同步到阿里云的大数据处理平台当中,并利用大数据工具对数据进行分析。一、背景介绍随着数据规模的不断扩大,传统的RDBMS…

那些阿里的年轻人

摘要: 今天是年轻人的节日 十九年前,杭州城西一间狭小简陋的民房里 有一群年轻人 他们衣着朴素、口袋里也没什么钱 但每个人的眼神是坚定的、热烈的 他们每天挂在嘴边的 是梦想要做一件改变世界的事儿 1999年,一群杭州的年轻人离开北京&#…

php的添加语句怎么写,php修改语句怎么写

php修改语句是“update student set 字段1新值1,…where id $id”,…;”,其中update语句就是用于修改数据库表中的数据。推荐:《PHP视频教程》PHP sql修改语句语法:$sql “update student set 字段1新值1,…where id $id”,…;注意&#xff…

招人!入职阿里仅1年,我和做AI的程序员薪资翻了2倍!

最近在知乎上,关于AI的这个话题又被顶起来,其中,这条回答让人印象深刻:在这短短的一条信息里,无疑显示出:AI行业缺人,高端岗位80万年薪恐怕也招不来!小编上周在一个AI群里&#xff0…

使用Unoconv和LibreOffice进行格式转换实现在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件

此项目根据企业真实需求制作而成,希望能帮助大家解决在线预览的问题! 此项目已开源,欢迎大家来STAR 软件版本SpringBoot2.2.2.RELEASELibreOffice6.3.2unoconv0.6文章目录一、配置管理① pom② yml③ controller④ 文件格式转换工具类FileFor…

关于CNN图像分类的一份综合设计指南

摘要: 本文是一篇关于使用CNN完成图像分类的综合设计指南,涵盖了一些模型设计、模型优化以及数据处理经验,是一份适合图像分类方向研究者参考的综合设计指南。对于计算机视觉任务而言,图像分类是其中的主要任务之一,比…

从GitHub中整理出来的15个最受欢迎的Python开源框架,你喜欢哪个

摘要: 从GitHub中整理出的15个最受欢迎的Python开源框架。这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等。 Django: Python Web应用开发框架 Django 应该是最出名的Python框架,…

greenplum配置高可用_高可用hadoop集群配置就收藏这一篇,动手搭建Hadoop(5)

01 ssh免密安装02 jdk安装03 hadoop伪分布式安装04 hadoop全分布式完成了前面四步,现在做hadoop的高可用。其实和之前的lvs的高可用差不多的。如果我们有两个namenode节点,分别是node01和node02。假设node01是主节点,node02是从节点&#xff…

聊聊我是如何在面试别人Spring事务时“套路”对方的

戳蓝字“CSDN云计算”关注我们哦!“中国最好面试官”我希望把面试当作是一次交流,像朋友那样,而不是像一场Q & A。但也有人觉得,我对应聘者“太好了”,这完全没必要,反正最后他也不会来。好吧&#xff…

JAVA 雪花算法 唯一ID生成工具类

package com.gblfy;/*** Author:JCccc* Description:* Date: created in 15:31 2019/6/12*/ public class SnowflakeIdUtils {// Fields/** 开始时间截 (2015-01-01) */private final long twepoch 1420041600000L;/** 机器id所占的位数 */p…

华为 | 泰山之巅 鲲鹏展翅 扶摇直上九万里

戳蓝字“CSDN云计算”关注我们哦! 文 | 阿晶、王银发于上海华为HC大会现场出品 | CSDN云计算(ID:CSDNcloud)华为在计算产业究竟要怎样LU起袖子加油干?五岳之首、泰山之巅、初升之日、鲲鹏展翅、昇腾万里、华为计…

前端 Leader 如何做好团队规划?阿里内部培训总结公开

摘要: "行成于思,毁于随"——韩愈 在阿里从一线前端工程师到技术 TL(Team Leader) 也三年有余了,最重要最难的就是做规划,你可能会遇到如下几个问题: 业务压力巨大,前端是…

印象笔记编辑pdf_做笔记就用印象笔记,支持录音做笔记( 附插件下载)

印象笔记是全球闻名的效率软件和知识管理工具,印象笔记可以帮助我们简化工作、学习与生活。你可以在手机、电脑、平板、网页等多种设备和平台间,无缝同步每天的见闻、灵感与思考。一站式完成知识信息的收集备份、高效记录、分享、多端同步和永久保存。下…

(vue基础试炼_07)Vue实例生命周期函数

文章目录一、生命周期图示二、常见的生命周期函数三、生命周期函数执行场景四、测试代码五、项目开源地址一、生命周期图示 二、常见的生命周期函数 常见的生命周期函数执行的时间beforeCreateVue初始化createdVue初始化beforeMount模板未渲染到页面上mounted模板已经渲染到页…

独家专访阿里高级技术专家北纬:Dubbo开源重启半年来的快意江湖

摘要: 罗毅,花名北纬。这个名字,如果是混过天涯论坛的大龄网民应该都不陌生,北纬67度3分周公子(简称北纬)虐杀易烨卿MM的世纪大战至今还是天涯神贴 ,当时更是有看客赋诗形容:“目睹此…

实践心得:从读论文到复现到为开源贡献代码

摘要: 本文讲述了从在fast.ai库中读论文,到根据论文复制实验并做出改进,并将改进后的开源代码放入fast.ai库中。介绍去年我发现MOOC网上有大量的Keras和TensorKow教学视频,之后我从零开始学习及参加一些Kaggle比赛,并在…

FPGA资源平民化的新晋- F3 技术解析

摘要: FPGA (现场可编程门阵列)由于其硬件并行加速能力和可编程特性,在传统通信领域和IC设计领域大放异彩。一路走来,FPGA并非一个新兴的硬件器件,由于其开发门槛过高,硬件加速算法的发布和部署保护要求非常高&#xf…

Vue计算属性、方法、侦听器

文章目录一、基础计算模板二、计算属性computed三、方法methods四、侦听器watch五、总结六、源码地址一、基础计算模板 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Vue计算属性、方法、侦听器<…