搞清楚这个老六的真面目!逐层‘剥开’人工智能中的卷积神经网络(CNN)
第三章:超越基础——图像中的特征检测

上一篇《揭开计算机视觉的神秘面纱,原来机器是这样“看图”的!》
本篇序言:上一篇我们实现并训练了一个神经网络,成功让计算机“看懂”了图像。可以说,我们已经一只脚跨进了AI研发的大门。不过,虽然我们迈入了AI这个神秘的领域,实际上,我们还只是站在门槛边缘。这里面有太多复杂的东西,连2024年AI领域的诺贝尔人工智能奖得主都无法完全搞明白,因为神经网络实在太复杂了,一个人的能力根本无法解析它所学到的知识。今天这一篇,大家只需要记住两个关键概念:“卷积”和“池化”。“卷积”是神经网络自己用来从图片中抽取关键信息的一种方法,而“池化”则是人类为了减小计算量和降低硬件负担,专门设计来进一步缩小“卷积”处理后图像的大小。只要弄懂这两个概念,后面的一切就会清晰许多。
(点击关注作者,及时获取人工智能领域的核心知识更新。本文作者拥有长达8年的人工智能实际经验,能为您带来平时学不到的独特知识。)
在上一篇中,我们通过创建一个简单的神经网络,利用Fashion MNIST数据集的输入像素将图像与10个标签匹配,每个标签代表一种类型(或类别)的衣物。虽然 我们创建的网络在识别衣物类型方面做得不错,但还是有一个明显的不足。
我们的神经网络是在一些小的单色图像上进行训练的,每张图像中只包含一件衣物,并且那件衣物都位于图像中心。如果要进一步提升模型的能力,我们需要让它学会检测图像中的特征。比如,不再只是看图像中的原始像素,而是想办法把图像分解成它的基本元素。与其匹配原始像素,匹配这些元素会帮助我们更有效地识别图像中的内容。
回想一下我们在上一篇用到的Fashion MNIST数据集——在识别鞋子时,神经网络可能是因为看到图像底部聚集的许多深色像素,才判断那是鞋底的。但是,如果鞋子不再居中,或没有填满整个画面,这种逻辑就不适用了。
其中一种用来检测图像特征的方法,源自摄影和图像处理。如果你曾用过Photoshop或GIMP这样的工具来锐化图片,你实际上是在使用一种对图像像素进行操作的数学滤波器。这种滤波器的另一个叫法就是“卷积”,而当你将这些卷积应用于神经网络时,就得到了大名鼎鼎的卷积神经网络(CNN)了。
在这一篇中,我们将学习如何使用卷积来检测图像中的特征,然后更深入地研究如何基于这些特征进行图像分类。我们还会探索通过图像增强来提取更多特征,使用迁移学习借鉴其他人训练好的特征,最后简单看看如何用“dropout”技术来优化你的模型。
卷积
简单来说,卷积就是一个权重滤波器,它会把一个像素与其周围的像素进行运算,得到一个新的像素值。举个例子,回想Fashion MNIST中的那张踝靴图像,看看图像中像素的数值变化,如图3-1所示。

图3-1:带卷积处理的踝靴图像
假设我们现在看的是一个图像中间的像素,它的值是192(记住Fashion MNIST的数据集是单色图像,像素值范围从0到255)。中间这个像素上面的像素值是0,左上角的是64,依此类推。
接着,我们定义一个3×3的滤波器,如下面展示的那样,滤波器的每个格子都有一个对应的值。我们要做的就是,把选中的像素和它周围的像素值分别乘以对应的滤波器值,然后把结果加起来,这个新的总和就是我们要替换的像素值。这个步骤会重复到图像中的每一个像素。
比如,当前像素的值是192,用滤波器处理后,新的像素值会是:
new_val = (-1 * 0) + (0 * 64) + (-2 * 128) +
(.5 * 48) + (4.5 * 192) + (-1.5 * 144) +
(1.5 * 142) + (2 * 226) + (-3 * 168)
结果是577,这就是新的像素值。用这个方法处理整张图像后,我们就得到了一个经过滤波器处理的图像。
接下来我们看看如果对一个更复杂的图像应用这个滤波器会有什么效果,比如SciPy自带的那个两个人爬楼梯的512×512的灰度图。用左边负值、右边正值的滤波器处理后,图像中大部分信息都会被移除,只有垂直线条保留下来。你可以看到图3-2的结果。

图3-2:使用滤波器提取垂直线条
类似地,如果稍微调整滤波器,能突出图像中的水平线条,如图3-3所示。

图3-3:使用滤波器提取水平线条
这些例子告诉我们,使用滤波器不仅能提取出图像中的特征,还能减少图像中的冗余信息。随着时间的推移,我们可以学习到更适合匹配输入输出的滤波器。
池化(Pooling)
池化就是在保留图像内容的语义信息的同时,去掉一些像素。这个过程更容易通过视觉示例来理解。图3-4展示了最大池化的概念。

图3-4:展示最大池化
在这个例子里,左边的框代表单色图像中的像素。我们把这些像素分成2×2的小块,也就是把16个像素分成了四个2×2的小数组,称为“池”。然后,我们从每个小块里挑出最大值,再把这些最大值组合成一张新的图像。这样,左边的像素数量就减少了75%(从16个像素减少到4个),新图像由每个池的最大值构成。
图3-5展示了在应用最大池化后,图3-2中的Ascent图像,垂直线条得到了增强。

图3-5:经过垂直滤波和最大池化处理的Ascent图像
注意,经过滤波器处理的特征不仅得到了保留,而且还得到了进一步增强。另外,图像的尺寸从512×512缩小到了256×256,只有原来的四分之一大小。
此外,还有其他的池化方法,比如最小池化,它选择每个池中的最小像素值;还有平均池化,它取每个池的像素平均值。
本篇最讲了机器学习中的两个重要的概念:卷积和池化,下一篇我们将实现一个卷积神经网络以及探索它各层的功能。
搞清楚这个老六的真面目!逐层‘剥开’人工智能中的卷积神经网络(CNN)的更多相关文章
- tensorflow卷积神经网络-【老鱼学tensorflow】
前面我们曾有篇文章中提到过关于用tensorflow训练手写2828像素点的数字的识别,在那篇文章中我们把手写数字图像直接碾压成了一个784列的数据进行识别,但实际上,这个图像是2828长宽结构的,我 ...
- Expo大作战(六)--expo开发模式,expo中exp命令行工具,expo中如何查看日志log,expo中的调试方式
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,将全部来与官网 我猜去全部机翻+个人 ...
- UFLDL深度学习笔记 (六)卷积神经网络
UFLDL深度学习笔记 (六)卷积神经网络 1. 主要思路 "UFLDL 卷积神经网络"主要讲解了对大尺寸图像应用前面所讨论神经网络学习的方法,其中的变化有两条,第一,对大尺寸图像 ...
- 老猿学5G扫盲贴:中移动的5G计费架构中Nchf'服务化接口以及CHF中的AGF
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.关于Nchf' 在中移动企标中出现了在3GPP ...
- 第四十六个知识点 在Sigma协议中,正确性,公正性和零知识性意味着什么
第四十六个知识点 在Sigma协议中,正确性,公正性和零知识性意味着什么 Sigma协议 Sigma协议是Alice想要向Bob证明一些东西的协议(Alice知道一些秘密).他们有下面的一般范式:Al ...
- 轻松搞定RabbitMQ(六)——主题
转自 http://blog.csdn.net/xiaoxian8023/article/details/48806871 翻译地址:http://www.rabbitmq.com/tutorials ...
- 无障碍开发(六)之ARIA在HTML中的使用规则
ARIA使用规则一 如果你使用的元素( HTML5 )具有语义化,应该使用这些元素,而不应该重新定义一个添加ARIA的角色.状态或属性的元素. 浏览器的语义化标签已经默认隐含ARIA语义,像nav,a ...
- 一文搞懂 Python 的模块和包,在实战中的最佳实践
最近公司有个项目,我需要写个小爬虫,将爬取到的数据进行统计分析.首先确定用 Python 写,其次不想用 Scrapy,因为要爬取的数据量和频率都不高,没必要上爬虫框架.于是,就自己搭了一个项目,通过 ...
- salesforce 零基础学习(六十二)获取sObject中类型为Picklist的field values(含record type)
本篇引用以下三个链接: http://www.tgerm.com/2012/01/recordtype-specific-picklist-values.html?m=1 https://github ...
- salesforce 零基础学习(四十六)动态美观显示列表中记录的审批状态
项目中,申请者申请某些事项以后,常常需要在申请列表中查看当前申请的记录所在的审批状态,动态美观的显示状态可以使UI更符合客户要求,比如下面这样. 以Goods__c表为例,申请者申请的一些采购以前需要 ...
随机推荐
- 图表全能王(ChartStudio) 上架VisionPro!
图表全能王(ChartStudio) - 终极图表制作工具!支持条形图.折线图.面积图.柱形图.条形图.饼图.玫瑰图.雷达图.牛肉图.风琴图.旭日图.桑基图等图表. https://apps.appl ...
- VUE—CLI学习
https://cli.vuejs.org/zh/guide/creating-a-project.html#vue-create 需要的自己来看吧 关于旧版本 Vue CLI 的包名称由 vue-c ...
- WPF 如何利用Blend给Button添加波纹效果
先看一下效果吧: 如果不会写动画或者懒得写动画,就直接交给Blend来做吧; 其实Blend操作起来很简单,有点类似于在操作PS,我们只需要设置关键帧,鼠标点来点去就可以了,Blend会自动帮我们生成 ...
- Python 字符串格式化输出
数字 n: int = 1000000000 print(f'{n:_}') # 1_000_000_000 print(f'{n:,}') # 1,000,000,000 对齐 var: str = ...
- SSH Agent 的作用
SSH Agent 是一种用于管理 SSH 私钥的程序,它可以帮助用户在使用 SSH 进行认证时,无需每次都手动输入密码.SSH(Secure Shell)是一种加密的网络协议,用于在不安全的网络中安 ...
- elastersearch7.6.1搭建及基本操作详解
搭建 修改系统参数 vim /etc/security/limits.conf * soft nofile 655350 * hard nofile 655350 * soft nofile 6553 ...
- compileSdkVersion, minSdkVersion 和 targetSdkVersion,傻傻分不清楚【转】
原文 https://blog.csdn.net/gaolh89/article/details/79809034 在Android Studio项目的app/build.gradle中,我们可以看到 ...
- 推荐一款流量录制回放工具:jvm-sandbox-repeater
在软件开发和测试过程中,我们经常会遇到需要对网络请求进行录制和回放的需求,以便进行调试.测试和分析.为了模拟真实的用户请求,我们通常会使用各种流量录制回放工具来记录并重放网络请求. 其中,jvm-sa ...
- MVC @Html.TextBox 属性
MVC中设置文本框不可修改(@Html.TextBox) mvc前台: @Html.TextBox("id","name", new {@Readonly = ...
- js 翻译 c# 注意事项
1. split('') 在 c# 是不可以 .Split("") 的 要写 ToCharArray() 更新: 2021-09-25, split('') 是不好的写法, es6 ...