当前位置: 首页 > article >正文

李宏毅机器学习课程笔记05 | 卷积神经网络Convolutional Neural Network(CNN)

文章目录

    • Image Classification
      • 问题:怎么将一张图片当作一个模型的输入
      • 全连接网络Fully Connected Network
      • 版本1神经元角度:观察1 Receptive Field
        • Typical Setting
      • 版本1神经元角度:观察2 parameter sharing共享参数
      • 总结 Convolutional Layer的好处
      • Convolutional Layer的版本2:filter角
      • comparison of Two Stories
      • 总结:Convolutional Layer
      • Convolutional Layer用于影像辨识的观察3:Pooling
        • pooling - Max Pooling
        • Convolutional Layers + Pooling
        • The whole CNN => pooling可有可无
      • CNN最常见的应用之一: Alpha Go
        • 与影像辨识比较
      • CNN近年来的应用:语音,文字处理NLP
      • To Learn More:CNN的缺陷——空间变换 ⇒data augmentation

本章提要

  1. 为什么设计NetWork的架构设计会让Network结果做得更好。
  2. 透过CNN,看NetWork架构的设计有什么想法。

Image Classification

在下面的讨论里,假设输入的图片大小是100*100的,这里的目标是分类,我们将每一个图片表示为One-Hot的向量,将其称为 y ^ \hat y y^

目前做影响辨识的时候,往往都有这样的假设。如果输入的不一样,常见的处理方式是把所有图片都先Rescale成大小一样

模型通过soft-max后输出为 y ′ y' y,我们希望 y ′ y' y y ^ \hat y y^Cross Entropy越小越好。

补充1:soft-max的作用

①归一化normalization每一个分量,并且和为1。

② 原本大的值跟小的值的差距更大

补充2: cross-entropy loss function 是在机器学习中比较常见的一种损失函数。

问题:怎么将一张图片当作一个模型的输入

对于机器来说,一张图片其实是一个三维的Tensor(维度大于2的矩阵就是Tensor)。其中一维表示图片的宽、另外一维表示图片的高、最后一维表示图片的Channel数目。

图片中每个像素都是由RGB三个颜色所组成,3个Channel就代表了RGB的三个颜色,也就是说3个Channel表示一个像素点。长*宽表示图片的像素数量。

将三维Tensor拉直后丢到一个Network里,拉直后的向量维度为100*100*3,每一维是某个pixel像素的某个颜色强度。

全连接网络Fully Connected Network

我们之前课程学习的网络是全连接网络,每一个Neuron跟每一个特征都有一个权重Weight。在本例中输入向量的每一个维度都是一个特征,那么每一个Neuron跟输入向量的每一个数值都有一个Weight

假设第一层的Neuron数目有1000个,这里的特征有100*100*3,那么一共有 3 ∗ 1 0 7 3*10^7 3107Weight

之前的例子补充理解

其实当天的观看人数可以和前几天的有关,模型可以表示为 = b + ∑ i s i g m o i d ( b i + ∑ j w i j x j ) =b+\sum_isigmoid(b_i+\sum_jw_{ij}x_j) =b+isigmoid(bi+jwijxj) i是不同的function函数数量,j表示当前日期的前j天, w i j w_{ij} wij第i个sigmoid给第j个特征的权重。

问题:模型的参数过多,可以增加模型的弹性,同时也增加了Overfitting的风险

之前学习的例子,方便理解

补充说明:为什么模型参数越多,增加Overfitting的风险

版本1神经元角度:观察1 Receptive Field

影像辨识的类神经网络的Neuron任务就是侦测输入的图片里有没有出现一些特别重要的Pattren,这个Pattern代表了某种物件。

识别的目标变成了:让Neuron判断有没有某种Pattern出现

不需要每个Neuron都去看一整张图(连接所有特征),也就是说对于每个Neuron其实不需要将整个图片当作输入,只需要把图片的一小部分当作输入就足够让它们侦测某些特别关键的Pattern

Typical Setting

在CNN中会设定一个Receptive Field区域,每一个Neuron都只关心自己的Receptive Field里面发生的事情。

假设下图中Receptive Field有3(长)*3(宽)*3(深)数值,下图蓝色neuron只需要关心这个范围就可以了。将这333的数值拉直成27维向量(27个特征)作为neuron的输入,Neuron会给每一维一个weight,所以这里有3*3*3=27个weight(每一维是某个pixel像素的某个颜色强度,可以看成一个特征)

问题:如何选出Receptive Field?

自己设置
1.每个Neuron的守卫区域可以重叠

2.不同的Neuron可以守卫同一个区域

每一个Receptive Field区域的大小可不可以不一样? => 可以不一样

有些Pattern可能只会在蓝色的 Channel出现,可不可以只考虑一个Channel => 可以

怎么确保一个Pattern没有被拆分给不同的Neuron

Typical Setting:最经典的设计是什么样的?

  1. 会看所有的Channel(RGB一起),而不是单一颜色 => 所以在描述Receptive Field时只需要将宽高(被称为kernel size),因为深度就是3。

一般kernel size不会设太大,影像辨识中一般3*3就足够了

  1. 同一个Receptive Field会有一组Neuron去守备这个范围,比如64或者128 => 使用一组的Neuron为了识别不同的模式
  2. 将一个Receptive Field往其他方向移动一点(移动范围被称为stride)制造一个新的Receptive Field => stride是一个超参数,需要自己调大小,一般不会设置太大,通常设置为1或者2

希望不同的Receptive Field之间有重叠(高度重叠),某个Pattern可能被拆分给不同的Neuron。如果Receptive Field没有重叠,那么会没有Neuron 去侦测它。

问题:如果一个范围为3*3,移动到最右侧时部分区域超出影像范围怎么办?

解决办法:超出的部分采用Padding补值,可以补0或者采用其他策略补值

版本1神经元角度:观察2 parameter sharing共享参数

观察到:同一个Pattern可能出现在图片的不同区域

不管在哪里,Pattern都应该在某一个NeuronReceptive Field区域,所以鸟嘴都会被侦测出来。 => 这些侦测鸟嘴的Neuron做的事情是一样的,只是守备的范围不一样。

每一个守备范围都去放一个侦测鸟嘴的Neuron吗?

结果:让不同Receptive FieldNeuron共享参数,两个NeuronWeight完全一样

不会让两个守备一模一样范围的Neuron共享参数,因为它们的输出肯定是一样的(输入和参数都一样)

问题:共享参数后只能检测一种Pattern吗?

解答:多个神经元对同一个Receptive Field进行侦测,其中一个神经元因为共享了参数所以具备检测鸟嘴的能力

在影像辨识中常见的参数共享方式:怎么共享是自己决定的

共享参数的神经元被叫做filter(一组weight)

总结 Convolutional Layer的好处

Full Connected Layer弹性最大 => Full Connected的network可以选择看一张图片还是看图片的部分,如果需要看图片的部分只需要将weight设置成0

不需要看整张图,只需要看图片的一小部分就可侦测出重要的Pattern => 这一小部分被称为Receptive Field => 弹性会变小

Model的弹性很高时容易导致OverfittingFull Connected Layer弹性很好可以做各式各样的事情但没办法在每个任务表现很好。

CNN存在Larger model bias(模型的限制变大不灵活或者理解成模型的弹性变小) => CNN专门为影像设计的(Receptive Field+ Parameter Sharing),模型的限制也是为了更好的融合影像特征,所以在影像上效果很好。

Convolutional Layer的版本2:filter角

Convolution里面有很多Filter,每个Filter的大小为33channeltensor。每个Filter的作用是抓取某个Pattern

  • 如果是彩色图片,channel=3(RGB)
  • 如果是黑白图片,channel=1(black and white)

问题:Filter怎么在图片中抓取Pattern?

假设Channel=1 => 黑白图

假设Filter里的参数已知 => 实际上Tensor里面的数值是Model里面的Parameter,这里的数值其实是未知的,要通过训练训练集找出。

1.先将Filter1(3*3*1)放在图片的左上角

2.将Filter里的九个值跟图片左上角范围内的9个值相乘(9个参数与特征相乘),然后结果累加起来(向量内积)。 => 模型中的 ∑ w x \sum wx wx

3.将Filter1右移Stride步(如果扫完就先往下移算完继续往右), 重复过程2。

4.图片全部扫完

开始Filter2Filter2侦察中间1列都为1的Pattern,重复上述过程。

每一个Filter都会给出一组数字,比如Filter1给出一组橙色的数字,Filter2给出一组蓝色的数字。这组数字被称为Feature Map

第一层的Convolutional Layer => 输入图片,输出Feature Map

我们将一张图片通过一个Convolutional Layer,产生了一个Feature Map。假设有64个filters,那么产生的Feature Map就有64组数字。

可以将生成Feature Map看成一张新的图片,只是图片的Channel=64(64组数据的叠加?类似RGB图的Channel=3)

第二层的Convolutional Layer => 输入Feature Map

第二层的Convolutional Layer里面也有一堆Filter,由于我们将第一层生成的Feature Map看成了一张新的图片,那么第二次的Convolutional Layer将识别Feature Map里的Pattern

这里的Filter大小也设为3*3*channel(这里3*3是自定义的),channel必须为64(因为新图片的channel=64) => Convolution Layer里filters设置的channel要和输入图片的channel相同

问题:如果filter的大小一直设置为3*3,会不会让Network没有办法看较大范围的Pattern呢?

第二次Convolution layer的filter大小设为33,其实在原图上考虑的是55的范围 => Network叠的越深同样是3*3的filter其实看的原图范围越来越大。

comparison of Two Stories

Convolution:将filter扫过一张图片这件事被称为Convolution

  1. 版本1里讲守备不同Receptive Field的Neuron会共用参数,这里共用的参数是版本2里的filter

卷积运算中也有Bias ,一般忽视

  1. 在版本1中,不同的Neuron可以share weight去守备不同的区域,share weight这件事就是版本2的filter扫过一张图

守备不同Receptive Field的Neuron可以共享参数来识别不同范围的特定pattern,相当于版本2中同一个filter不断的移动扫过整张图片来识别特定的pattern。 => 版本2中的filter就是共用参数的neuron

总结:Convolutional Layer

-Neuron Version StoryFilter Version Story
观察1:不需要看整张图片Neuron只看图片一小部分 => Neuron只守备Receptive Field区域有一组filter,每个filter只侦测一个小的pattern
观察2:同样的Pattern可能出现在图片的不同地方Neuron间可以共享参数1个filter都要扫过一整张图

卷积核就是filter,一个卷积核用来筛选出一种频域特征

Convolutional Layer用于影像辨识的观察3:Pooling

观察:把一张较大的图片做Subsampling二次抽样,比如将偶数的Column和奇数的row去掉,图片变为原来的 1 4 \frac{1}{4} 41,不会影响图片里的内容

pooling - Max Pooling

pooling本身没有参数,所以它不是一个Layer,它没有要学习的参数。pooling比较像是一个Activation Funciton,类似Sigmoid、ReLU,不需要从训练资料中学习什么,只是一个行为固定的操作。

Pooling有很多版本,这里介绍Max pooling

Max Pooling的运作原理

每个filter都产生一组数字,将这组数字分组(怎么分组自己决定)。比如以下例子就是2*2个数字一组,每一组里面选一个代表。

Max Pooling方法是选择最大的一个为代表

具体的选择方法是自己定的,有各式各样pooling的方法,比如:mean pooling方法是选平均

Convolutional Layers + Pooling

Convolution之后往往会搭配Pooling,Pooling做的事情就是将图片变小。 => channel不变,长宽变小

在实际的操作上,一般ConvolutionPooling交替使用,比如几次Convolution后接一次Pooling

Pooling目的是减少运算量,但由于较少了图片信息可能会对影响模型性能。 如果运算资源足够,很多 Network 的架构设计往往就不做 Pooling,全Convolution。

The whole CNN => pooling可有可无

将输出(矩阵)Flatten扁平化成一个向量,再把这个向量作为Full Connected Layer的输入,可能还会有

softmax最终得到影响辨识的结果。

CNN最常见的应用之一: Alpha Go

下围棋是一个分类的问题,由Network去预测下一步落在哪里最好。

Network的输入是棋牌上黑子、白字的位置,输出是下一步落子的位置。

问题:怎么讲棋盘上黑子、白字的位置表示成一个向量作为Network的输入?

棋盘有19*19个位置,将棋盘表示为19*19维的向量(拉直后)。黑棋为1、白棋为-1,没有棋为0。

将其输入到网络中后,由网络预测19*19 classes中,选择哪个位置最好。

问题:可以用Full-connected network解决,但使用CNN的效果最好,为什么?

:可以将棋盘看成一张19*19的图片,图片上每一个Pixel像素代表棋盘上可以落子的位置。每一个棋盘上的Pixel用48个Channel描述,48个数字来描述那个位置发生了什么。

与影像辨识比较

共同点

问题:为什么CNN可以用在下围棋上

:围棋和影像有共同的特点

  1. 不用看全局,只需要看小部分

  2. Pattern会出现在棋盘的不同位置出现

不同点:下围棋是个精细的任务,没有使用Pooling

CNN近年来的应用:语音,文字处理NLP

语音和NLP中Receptive Field的设置与影像识别中是不一样的,需要结合语音和文字的特性设计Receptive Field

To Learn More:CNN的缺陷——空间变换 ⇒data augmentation

CNN没办法处理影像放大、缩小、旋转的问题。 => 在做影像辨识时,往往都需要做Data Augmentation

Data Augmentation:将训练资料的每一张图片都截一小部分放大,让CNN看过不同大小的Pattern。将图片旋转,让CNN看物体旋转以后的样子…

network架构spacial transformer Layer可以处理这个问题

CNN是按像素识别的

pooling的放大缩小是成比例放缩,这里的放大缩小类似剪裁。


http://www.kler.cn/a/577839.html

相关文章:

  • 目标追踪综述
  • 8. 机器人模型训练与评估(具身智能机器人套件)
  • selenium库工作原理
  • Three.js 进阶(uv映射的应用)
  • tauri-plugin-shell插件将_blank的a标签用浏览器打开了,,,解决办法
  • 搜广推校招面经四十
  • Kotlin 协程和线程的主要区别
  • 腾讯云TBDS获金融信创实验室全项适配认证 打造国产化大数据平台标杆
  • docker 常用命令教程
  • 单例模式:确保一个类只有一个实例
  • C# 初学者的系统学习路径与职业规划指南
  • Prompt Engineering的技术发展趋势
  • 在Spring Boot项目中分层架构
  • vue3如何配置环境和打包
  • 【Python 数据结构 10.二叉树】
  • 十、Redis 主从复制:原理解析、配置实践与优化策略
  • Linux上位机开发(开篇)
  • 创新科技,绿色防护——稀土抑烟剂让板材更安全
  • API安全防护探析:F5助企业应对关键安全挑战
  • 解决Jenkins默认终止Shell产生服务进程的问题