卷积神经网络学习笔记

1.卷积神经网络的图像识别原理:

通过过滤函数 来描绘出图像的边界: 过滤函数和图像相同区域的数值进行相乘,得到新的图像, 新图像则只剩下边图像。

cross-correlation: 可以旋转过滤函数,让不同方向的边都可以识别。

1 1 1 -1 0 1

0 0 0 -1 0 1

-1 -1 -1 -1 0 1

n*n为大图, f*f为核函数, p为边padding默认为0, s为步长stride默认为1, o*o为输出图像

公式为: (n+2p-f) /s +1 = o

2.RGB图像边界识别问题:

height, width, channel , RGB是3个channel

a. 多层数值的图像,对应的过滤函数也是多层。 比如3*3*3相乘的过程,就是27个数值相乘再相加, 得到边界值。

b. 水平和垂直的过滤函数, 对一个图像进行多个方向的过滤,得到多个方向的边界图像值, 构成多层图像channel

n * n *nc 乘以 f * f * nc --> (n - f +1) * (n - f +1) * n1/c

n1/c为边界方向的个数,比如水品,垂直,45度就是3

3.图像边界识别和神经网络计算结合a, z, w, b的映射

单层卷积网络:

a0为输入矩阵,也就是RGB图像的n*n*3的数值矩阵

w0+b为过滤函数Cube数,每个Cube为f*f*3的矩阵,每个边界分割的角度建1个Cube,10个角度就是280个参数。 280=10 *(3*3*3 +1)

a1=Relu(a0*w0+b) 输出图像为: (n-f+1) * (n-f+1)的 10层的结果

4.卷积神经网络的数据流结构ConvNet

是否是Cat:

输入的RGB图像,经过一层filter转换成新的边界图像,边界图像再下一层filter转化为新图像, 在最后一层的时候,把图像展开为1维的向量, 1维向量再接入到普通的DNN多层神经网络中,最后softmax再输出分类结果9~0

卷基层:ConvNet: 每层都是用filter来过滤出新层。

池化层:PoolNet: 每层filter,filter中不是相乘,而是取最大值(max pooling, average pooling),得到新层输出。 filter没有参数值,只有size. 只有2个参数filter, stride

FC层:FullConnect: 普通的神经网络层

输入层 --> ConvNet --> MaxPooling --> ConvNet --> MaxPooling --> FC1 --> FC2 --> FC3 --> SoftMax

5.卷积的好处

原始的图像识别: 16*16的像素,摊开成256的输入向量,最后用SoftMax来分类。

卷积的方法相比的好处:

Filter过滤,转换像素值。 每层向下的像素精简了,剔除了冗余的训练数据,只保留了边界等明显的特征像素。因此,最后用于神经网络训练的数据大幅减少。

1.Parameter Sharing: 单个Filter可以在全图使用,RGB三层都可以,也可以在相似的应用场景共享。

2.Sparsity Connection: 卷积过程各种,每个输出的值,只依赖很少的输入数据和参数。 因此容易回溯和调整

6.经典的图像识别网络

通过论文发布的一些比较固定的层级框架

LeNet-5 : 1980

(5Filter + 2AvgPool) * 6Channel --> (5Filter + 2AvgPool) * 16Channel --> FC120 --> FC84 --SoftMax

Filter之后可以加一层激活函数层,就是对生成的矩阵进行激活函数值转换, 然后取max pooling,效果比较明显。

AlexNet :

(11Filter + 3MaxPool) * 96Channel --> (5Filter + 3MaxPool)*256Channel -->3MaxPool-->3MaxPool-->3MaxPool-->3MaxPool --> FC9216 -->FC4096-->FC4096-->SoftMax

参数非常多,不太好用

VGG -16: 16表示有16层

每层的filter和max_pool参数都是一样: f=3 s=1,p=1, max_pool=2, s=2 channel数从64开始,递增到512,最大为512.

512重复一次filter+pool的块,之后接2层FC4096, 最后SoftMax分类

7.残差网络

ResNet: 152层 Redidual Network

几个华裔发明的计算方法,让网络能够支持更多的层次。 要点就是在把a值,跳过一层,或者多层,直接加到目标层的 z值里面 , 之后再调用激活函数进行输出。

一般的网络随着网络层次的增加,training error会变大,而ResNet则不会,可以持续降低Training Error.

有用的原因:

1.由于有增大z值,因此,让w取值有更大的可选范围。 不会因为w多次相乘变得特别小

2.从dimension的角度是看,a和后面的z的dimension必须一样,不然无法相加。 因此,可以增加ws * al,来转换dimension

8.ResNet 基于残差网络的图像识别方案:

在CNN的卷积层之间做残差网络,以VGG的理念为基础, 每个Conv的输出前后保持一直, 同时channel也保持一致, 因此:

g(z(l+2) + a(l)) 的dimension是可以相加的, 另外如果出现了pool层的残差跳跃, 需要引入ws,修正dimension. (ws可以是固定的,也可以是变动的)

9.使用1*1卷积

主要用于调整图像的dimension

32*32*196的图像, 应用 1*1* *32的卷积, 调整后得到32*32*32的图像

在32*32中取1格, 196个值和卷积值相乘, 最后relu输出。32*32格子计算出平面层, 32个channel输出32个层

10.谷歌的Inception注入网络:

对于一个Conv卷积层,通常是选定一个filter 比如1*1,3*3, 5*5. 而inception的方案,则是同时选择很多个filter,通过调整padding和stribe让众多的filter结果生成的输出结果是同样的dimension.

使用 1*1 卷积,把一个很大层次的图像减少到相对比较少的层次,再进行Inception的操作,1*1减少了计算的次数,降低到了10%

a.Inception Module是指一个Conv层包含了多个不同规格的filter,而输出结果是统一规格。 Inception Network是指卷积神经网络中,包含一系列的Inception Module.

b.通常一个Inception Block是分2层,先卷积1*1, 再加filter,减少计算的次数。 同时在Inception Block的filter中要包含Max_Pool的filter.

c.分支上输出可以直接用于分类,效果可能也不会太差。

11.迁移学习的三种方案

迁移学习是指下载一些比较好的分类结果的代码和weight,用在自己的应用场景中。

1.自己应用场景数据比较少的情况下,去掉下载代码的SoftMax层,把自己的数据+Weight转换之后,形成新的数据,本地保存,再用这个数据去进行分类训练。 下载的Weight在训练中不会更改。

2.自己自己的数据+90%Weight的数据,本地保存后,再填充几个隐藏层,加上自己的SoftMax进行分类训练。下载的Weight在训练中少量更改。

3.构建一样的网络,只是用下载的Weight进行初始化, 下载的Weight在训练中会全部更改。

12数据扩充

把图片进行镜像,旋转, 截取,缩放等操作,生成新的图片用于标记。

13.计算机视觉现状

a.数据是指有label的数据(Label Data),这种数据有时候是非常昂贵的。

b.如果有label的数据非常少,则适合使用hand engineering,数据多则可以用AI

物体识别(自动驾驶): 目前数据非常少,主要原因是标记数据的成本太高。

图片识别: 中等数据量,比如识别人,识别猫狗等,人脸等。 有许多标记好的数据。

语音识别: 数据量非常多, 适合AI

Transfer Learning:迁移学习, 少量数据的救星。

Benchmark: 基准比赛的诀窍

Ensembling Learning: 集成学习: 同时训练多个网络,最后把所有网络的y`,输出进行平均,而不是权重进行平均。 效果比较显著,但是耗时非常大, 因此一般用于比赛, 很少用于生产环境。

Multi-Crop: 1张图片衍生出10张图片,分别计算出y`,最后进行平均。 同样也是消耗资源较大,很少用于生产环境。 比赛预算够的话可以实施。同时运行10个以上network, 并保持同步。

建议:

1.用别人的Pretained Mode,别人已经用上千GPU训练了结果

2.用OpenSource的框架

3.计算机视觉的很多模型是通用的,因此尽量不要从0开始搭建系统

4.网络层级架构尽量采用已经在学术文献中公布的架构。比如ResNet,VGG等。尽量不要重复发明轮子。

14.目标定位

a.目标识别是在图片分类的范畴

b.目标定位是目标识别的基础上,再识别目标在图片中的位置。主要表现为用红框把物体标记出来

c.多个目标在图片中的定位,空间距离

侦测图片上的行人,车辆,自行车,背景。 SoftMax分4类

目标定位的输出数据:

Bx,By,Bw,Bh, + 分类1,分类2, 分类x

Bx,By,Bw,Bh 能标识出红框在图片上的位置,以及图片的分类。 因此训练过程中的label data,就包括具备分类标签的图片,以及红标。

红框的值,以(0,0),(1,1)坐标体系为基准,x,y为右上角点的坐标, w,h为水平和垂直的长度

标记数据y的表示:

Pc: 是否有行人,车辆,自行车 0/1

C1: 有行人 0/1

C2: 有车 0/1

C3: 有自行车 0/1

Bx: (0,0),(1,1)坐标体系内红框中心点的x坐标

By: (0,0),(1,1)坐标体系内红框中心点的y坐标

Bw: 红框x方向上的宽度

Bh: 红框y方向上的长度

15.特征点检测LandMark Detection

特征点是指图片上一组标记的点,用于定义相应的标签, 比如4个眼角的点,定义眼睛。 或者64个点,定义脸部。

标记数据y的表示 (0,0),(1,1)坐标体系内 :

Pc: 是否有眼睛

Llx: 左眼的左边点x

Lly: 左眼的左边点y

Lrx: 左眼的右边点x

Lry: 左眼的右边点y

Rlx: 右眼的左边点x

Rly: 右眼的左边点y

Rrx: 右眼的右边点x

Rry: 右眼的右边点y

目标检测(滑动卷积窗口)

把图片切分成很多个小窗口, 然后对小窗口中的图像进行分类,判断图像中的是否有Car,以及Car的红框的位置。

切分会按照不同的窗口尺寸来切人,确保能够把不同位置的Car都装到窗口里面去。

缺点: 这种判断的方法会需要同时运行很多个窗口的判断,性能会存在一定的问题。

16.滑动卷积窗口的优化实现Sliding Window

要点:

a.把FC层,用Conv层来替代. 用同样规格的filter的卷积来转换,成1*1*channel

b.找到一组源图尺寸,Conv的Filter, MaxPool配置,让最终结果是1*1*Channel

c.对其他大图,采用相同的Filter,Max_pool配置,得到的结果是以源图尺寸为SlidingWindow的结果集合。

d.这种实现方法的好处是能提高效率,确定好sliding window的大小后,一次就能把图片上的所有sliding window全部计算完成

Sliding Window预测过程:

1.训练过程,每个图片定义一个y'的label,包含bouding box的位置,sliding得到n*n*8的矩阵,再SoftMax到Y'

1.预测过程,输入图片,得到Y'的值。

这种结果往往不是特别精确。

Sliding Window

X图片 --> Conv --> Max --> sliding1*1卷积 --> sliding n*n*8 -SoftMax-> Y' 8 n为Sliding Wndow的横向个数。

Grid预测过程:

1.训练过程,引入19*19的Grid,对每个Grid定一个y',包含bouding box的位置定义。训练的结果是是19*19*8的矩阵。

2.预测过程,输入图片,得到19*19*8的结果

准确的原因,综合了19*19次的运算结果。

X图片 --> Conv --> Max --> sliding1*1卷积 --> sliding n*n*8 -SoftMax-> Y' (19*19*8)

label过程中,bouding box的中心所在的Grid,才被标记为有Car和bouding box,非中心不标记。

避免在1个Grid中包含两个Object

17.交并比 IOU,Intercection of Union

用预测出来的bouding box,与实际的bounding box进行比较,取重合部分。重合部分除以预测的部分就是交并比,(IoU ),IoU=1标识预测非常准确,IoU=0表示失败

IoU >= 0.5一般表示预测比较成功。 0.5为经验值,但非必须。

18.预测结果选择No Max Suppression(非极大值抑制)

多个目标物体的选择过程

a.对图片进行predict,由于使用了19*19的Grid,那么很多小Grid可能都会产生结果,标识出有Car.

b.在这些Grid的结果中,pc值最大的,bouding box,标记出来。同时,把和与这个BoudingBox有IoU相交的BoudingBox中IoU>0.5的也去掉(去掉同一物体的重复选取box)

c.在剩下的Grid结果中,再找pc值最大,标记出来,同样也把其他BoundingBox中相对IoU>0.5 去掉。

d.多次循环选择推出条件,Pc必须>0.6,小于0.6的直接忽略

19.单个Grid里面预测多个Object的方法:Anchor Box

单个Grid里面有多个物体的识别方法: 轻微改动,把Y'从原来的8维,变成16维,用于标识2个物体就可以了。

AnchorBox分为横向和竖向两种,因此,Label图片的时候,需要根据不同的内容,选择不同的Anchor Box。 瘦的为Anchor1,胖的为Anchor2.

20.人脸识别系统

Verification:

同时给出图片和身份Id,判断图片是否是该人。1-to-1问题

Recognition: 1对多的问题

通过图片识别出该图片中的人的Id. 比如有100个人的数据,给出任意的图片,识别图片的人id,或者“未识别”。

One-Shot Learning Problem:

一般人脸识别,都只提供了一张图片(用不了深度学习数据太少),而要求是根据一张图片来识别人物。比如公司只有雇员一张图片,系统智能学习一张图片,达到识别的目的。难度较高。

图片相似度计算(Similarity)

输入的图片和数据库中的Id图片,计算相似度,得到相似值。 大于1个阀值的时候,则判断身份识别。

21.Siamese网络:相似度训练网络

判断2个图片相似度的方法,两个图片分别执行相同的Conv层和FC层,得到一组parameter,再求两组parameter的标准差。值越小说明两个图片越相似。

22.Triplet损失

比较优秀的方式来训练Conv的参数

训练集合先分成3组,且配对,再进入训练。

Anchor: 目标图片

Positve: 同一图片

Negative: 不同图片

3个一组进行训练, 计算loss function: f(A)-f(P) - f(A)-f(N) + a

对于数据集来说,找到很多组的3个照片进行训练, 最佳的效果是f(A)-f(P)和f(A)-f(N)很接近。

训练过程:

a.所有图片打label:手工挑选图片分成3组,分Anchor,Positive,Negative

b.每组所有图片计算f(x),conv->pool->fc->fc,得到x1,x2,x3维向量,

c.X1,X2,X3计算出Triplet损失值,之后采用BP方法,AdamOptimizer训练参数

weight_filter_conv1,

bias_conv1,

weight_filter_conv2,

bias_conv2,

weight_filter_fc1,

bias_ fc1

weight_filter_fc2

bias_ fc2

d.三个图片采用相同的weight,bias参数进行训练。每次输入3个图片,BP1次,然后换下一组图片,BP1次,直到loss值比较稳定

Triplet基本上只用来训练参数,用来确定各种weight的取值, 而正式的预测,则需要生成多维向量, 再训练一次二分类。见二分类

23.面部验证与二分类

训练和预测过程:

a. 每组2个图片,定义weight和bias构建ConvNet,最后在FC层以逻辑回归的方式,Sigmoid函数生成y'的值

b. Label图片,如果一组图片同一人,则y'=1,否则为0

c. 训练所有Label的图片,得到所有的weight和bias

d. 预测对输入的2个图片,计算y'>0.5则判断是同一人

技巧: 当weight和bias都确定后,可以提前计算图片库中所有图片的FC向量值,并固化。

当需要识别新图片时,循环雇员的图片库FC向量值,一一计算y'值, 找到最大值,如果最大值小于0.5则显示不识别。

24.基于神经网络的图像风格转换Neural Style Transfer

Content Image: 内容图片

Style Image: 风格图片

Genreated Image: 合成的新图片

深度学习隐藏层图片可视化效果

通过各种方法,把学习过程中的图片可视化展示,用来了解算法所学习到的边界,或者特征。

有专门的论文来描述如何实现

迭代的过程如下:

a.先构建一张目标图,用随机像素

b.建立Lost Function,进行Gradient Desent计算dt(a * J(G) /2G )

c.随机像素图减去dt,然后逐步变成目标图片

d.dt的计算有相应的公式

G=G - a * J(G) /2G

J(G)=a Jconent(C,G) + b Jstyle(S,G)

25.从一维数据到三维数据

一维数据可以用RNN来解决

三维度数据同样也可以用CNN来建模

本文来自企鹅号 - Tunky的实用主义媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏瓜大三哥

竞争型神经网络续1

1.竞争神经网络函数 1.1创建函数 1.1.1 newc函数 newc函数用于创建一个竞争层,这是一个旧版本的函数,现在用competlayer函数代替。函数...

437100
来自专栏ATYUN订阅号

机器学习的基础讲解:神经网络

在之前的文章中,我通过展示学习过程中成本函数和梯度下降的核心作用,阐述了机器学习的工作原理。本文以此为基础,探索神经网络和深度学习如何工作。这篇文章重点在于解释...

31760
来自专栏深度学习那些事儿

利用pytorch实现神经网络风格迁移Neural Transfer

载入图像输入大小无要求,最终会被剪裁到相同大小,这是因为神经网络设计了一个特定的输入大小,因此内容图像和风格图像必须大小一致。

49120
来自专栏深度学习自然语言处理

深度学习之激活函数详解

激活函数是什么 激活函数,即Activation Function,有时候也称作激励函数。它是为了解决线性不可分的问题引出的。但是也不是说线性可分就不能用激活函...

30870
来自专栏红色石头的机器学习之路

台湾大学林轩田机器学习技法课程学习笔记9 -- Decision Tree

上节课我们主要介绍了Adaptive Boosting。AdaBoost演算法通过调整每笔资料的权重,得到不同的hypotheses,然后将不同的hypothe...

28900
来自专栏人工智能

深度学习之激活函数详解

激活函数是什么 激活函数,即Activation Function,有时候也称作激励函数。它是为了解决线性不可分的问题引出的。但是也不是说线性可分就不能用激活函...

26380
来自专栏CVer

深度学习的卷积算法指南[1] 卷积和池化简介

本文简要回顾了卷积神经网络(CNN)的主要组成部分,即离散卷积(discrete convolutions)和池化(pooling)。

48550
来自专栏贾志刚-OpenCV学堂

使用OpenCV与sklearn实现基于词袋模型(Bag of Word)的图像分类预测与搜索

基于OpenCV实现SIFT特征提取与BOW(Bag of Word)生成向量数据,然后使用sklearn的线性SVM分类器训练模型,实现图像分类预测。实现基于...

60130
来自专栏智能算法

SVM 的“核”武器

一、上一次我们讲到关于SVM通过拉格朗日乘子法去求解的部分,引入乘子 得到下面的式子: ? 我们令 ? 当所有的约束条件满足时,我们得到的 ? ,而之前的优...

34560
来自专栏IT大咖说

阿猫还是阿狗?AI视觉识别中目标检测的关键技术

内容来源:2018 年 04 月 21 日,AI教育求职平台景略集智创始人王文凯在“百度深度学习公开课·北京站:AI工程师的快速进阶之路”进行《目标检测面面观》...

10810

扫码关注云+社区

领取腾讯云代金券