CNN卷积神经网络(一)大白话基础

本文参考了 这个教程

(一) CNNs和Regular Neural Nets的对比

Regular Neural Nets:普通神经网络
CNNs/ConvNets:卷积神经网络

(1)选手简介

  • 普通NN的输入是一个向量,这个输入向量经过NN的多个hidden layers转化为一组类别分数,class scores。

每一个隐层都是由一组神经元组成,并且每个神经元都和前一层的所有神经元全连接!!单层内的神经元们完全独立,相互之间并不共享任何连接。最后一个全连接层也成为输出层,在分类问题里,这一层就表示类别分数。

  • 普通NN不能很好的扩展到full image的处理。这主要是因为NN的全连接机制使得图像处理任务的权重参数太多了,一个神经元也许就要处理几十万数量级的权重,这明显不是manageable的,参数数量过多也很容易引起网络过拟合。
  • CNN的每一层不像NN那样只有一个维度,而是有三个维度,每一层(layer)也被称为一个体(volume)。神经元被安排在3个维度,width,height,depth(这里的depth不是指网络深度,即总的隐层数目)。
  • CNN的每个神经元只和前一层的某一小块神经元连接(这就是学习了猫的猴子的视觉局部性,接受域 receptive field),而不是像NN那样和前一层所有神经元连接。但最后一层仍然是全连接层,在分类问题中最后一个volume的size是11a,a是类别总数。
  • CNN也由多个层组成,每一层都是以一个可微函数(有参数或者无参数,比如池化和relu 层的操作就没有参数,卷积层和FC层的操作需要偏置和前一层某些神经元的activations作为计算参数,conv层自己需要提供的参数主要是所有filter。)的形式,把一个输入三维体转化为一个输出三维体(3D Volume)

Note that some layers contain parameters and other don’t. In particular, the CONV/FC layers perform transformations that are a function of not only the activations in the input volume, but also of the parameters (the weights and biases of the neurons). On the other hand, the RELU/POOL layers will implement a fixed function.
卷积/FC层的参数们会通过梯度下降的方法训练,使得最终的类别分数与label一致consistent。
在这里插入图片描述

(2)相同点

  • 和普通NN一样,整个CNN从最开始的原始图像像素值,到最末端的类别分数,从本质上说实际上都是,表达了一个可微的评分函数

The whole network still expresses a single differentiable score function: from the raw image pixels on one end to class scores at the other.
这句话太精辟了,道出了所有NN的本质,虽然看上去很复杂,形式多样,数学复杂,训练麻烦,但实际上一切的一切说白了,NN就是表示了,表达出了一个评分函数,它是一个映射,把一张图像映射到多个分数,每个类别一个分数,图像归类为得分最高的类别。

  • 都是由很多有可学习的权重和偏置(learnable weights and biases)的神经元组成。每个神经元都接收一组来自前一层神经元的输入信号,对这些输入做一个点乘(dot product,连接到该神经元的前一层神经元的激活程度向量和权重向量的点乘),再可选地加个非线性操作(比如sigmoid)。performs a dot product and optionally follows it with a non-linearity。
  • 全连接层(最后一层)仍然有一个损失函数Loss function。
  • 所有训练regular NN的tip啊trick啊,训练CNN仍然适用。still apply

(3)不同点

ConvNet architectures make the explicitassumption that the inputs are images.

CNN明确假设了,输入必须是图像,而普通NN的输入是一个向量a single vector。

(二)Layers used to build ConvNets卷积网架构中的层

A simple ConvNet is a sequence of layers, and every layer of a ConvNet transforms one volume of activations to another through a differentiable function.

(1)INPUT输入层

hold the raw pixel values of the image.
就是原始图像,神经元取值就是像素值。一般彩色图像都是RGB三个颜色通道,所以输入的三维体的size就是图像的size,比如2002003

(2)CONV卷积层

  • 执行点积。用几个filter,得到的volume的depth维度就是几。比如用10个不同的filter(但size同)去对输入的三维体( 200 ∗ 200 ∗ 3 200*200*3 2002003的输入图像)进行相关/卷积操作,得到 200 ∗ 200 ∗ 10 200*200*10 20020010的volume
  • The CONV layer’s parameters consist of a set of learnable filters. Every filter is small spatially (along width and height), but extends through the full depth of the input volume. 卷积层的参数就是一组可学习的滤波器。这些filter在空间维度上都比较小(局部性嘛),但是depth 维度是由输入的volume的depth决定的,二者相等。比如一般第一个紧跟输入图像的卷积层的filter的size多为 5 ∗ 5 ∗ 3 5*5*3 553,depth是3就是因为图像volume的depth是3。
  • 一个filter卷积一次输入volume,得到一个二维的激活图activation map(因为filter和输入volume的depth是一样的,所以直接在两个空间维度上遍历,553共75个值相加的总和就是当前位置卷积结果)。多个相同size的filter卷积得到的多个同size的二维激活图stack起来就得到了输出volume,成为下一层的输入volume。文首的链接里面有个动图,把多个滤波器卷积输入体的计算过程展示地非常详尽,可以自己去计算一下看理解的是否正确。
  • 局部连接性:由于CNN处理的数据是图像,是高维数据,前面也说过了,不可能像regular NN那样每层都全连接,会参数爆炸,所以每个neuron只连接前一层的volume的一个局部空间范围spatial extent,这个范围和filter的size是一样的,width和height两个axis没有全覆盖,但depth那个维度是全覆盖的,比如输入volume是 32 ∗ 32 ∗ 12 32*32*12 323212,filter size是 3 ∗ 3 ∗ 12 3*3*12 3312,则一个神经元能看到的前一层的空间范围就是 3 ∗ 3 ∗ 12 3*3*12 3312,因此计算也局限在这里面执行,参数大大减少。
  • 输出volume的神经元空间安排:主要有三个超参数可以控制输出体的size,他们是the depth, stride and zero-padding。

首先,depth就等于filter的数目,每一个filter都努力从输入体学点不同的东西如有向边,色斑啥的oriented edges, or blobs of color。如下图,粉色的是输入图像( 32 ∗ 32 ∗ 3 32*32*3 32323),蓝色是第一个卷积层,明显它的depth dimension有5个神经元,他们看到的输入体的空间范围是一毛一样的,实际上这就是5个不同的filter分别卷积输入体得到的5个二维activation map堆叠起来的。我们把这样的五个神经元叫做一个depth column或者叫做fibre。
在这里插入图片描述
stride,步长,就是filter卷积核卷积输入体时一次滑动几个单位。很简单,一般都是用1,2,基本实际中没有用更大步长的,因为很明显补偿越大得到的卷积层就越小,损失数据越多。但我们就算想降维也基本不靠这种方式降维,因为损失太多有用数据。
zero-padding,补零。**这个操作只有一个作用,那就是保证卷积后的输出和输入一样大的空间size!**补零是around the border进行。补零的size也是一个超参数。most commonly we will use it to exactly preserve the spatial size of the input volume so the input and output width and height are the same

注:hyperparameter超参数是指学习之前设置的参数,而非训练学习到的数据。

对两个问题再解释一下

  1. 为什么卷积核的步长常设为1?
    一是因为步长为1保证了卷积层不会大量的减少数据维度(卷积步长越大,很明显得到的输出体越小),只是做自己卷积层的本职工作,通过不同的filter去提取输入的不同的表示,而数据降维和参数减少让池化层去做,各司其职,术业有专攻。二是因为实际应用中小的步长反而工作的更好,效果说话。
  2. 为什么要用padding?
    保证卷积前后的空间size不变。如果不补零,网络中多个卷积层,依次减小输出体的空间size,最终border上的信息就会逐渐消失be washed away了。

(3)RELU

relu是按每个神经元的激活程度操作的,比如如果使用max(0,x)函数的话,会使得所有负的激活值变为0,size of volume 不变

(4)POOL池化层

perform a downsampling operation along the spatial dimensions (width, height), resulting in volume such as [100x100x10].
只是沿着两个空间维度进行下采样。
池化层常被周期性地插入到卷积网的架构中,主要目的是逐渐progressively减小学到的表示representation的空间尺寸,从而减小计算量和参数量,也从而控制了过拟合。
一般都是用最大池化,因为均值池化和2范数池化的性能在实际中表现不如max pooling。
池化层对自己的输入体的每一个depth slice独立操作,操作完了又stack起来就得到了输出体。
最普遍的池化操作参数是 2 ∗ 2 2*2 22的filter size,步长也为2.这样就是无重叠的池化,而且每次操作会从4个数据中删去3个,因此可以删去75%的数据量,大大减小了输出体的size。如图:
在这里插入图片描述
还有一种有被用过的池化filter size是 3 ∗ 3 3*3 33,步长仍是2,就是重叠池化overlapping pooling,但用的很少很少因为删掉的数据太多了,8/9···,反而降低了网络性能
实际上,池化···真的感觉经不住考验,毕竟真的就是很暴力的直接删除某些数据以达到降维目的···感觉很单薄无力没有任何理论支撑,只是说大家都在用,用起来也还不错····但最近几年已经有很多研究在抨击池化了。。有一些论文明确提出抛弃池化,只使用卷积层,全卷积网络,还有variational autoencoders (VAEs) (可变自编码器)或者generative adversarial networks(生成对抗网络) 这些比较好的生成模型,也都没有使用池化。

(5)FC全连接层

和前一层所有神经元连接,要计算class scores,和普通NN一毛一样。
FC和Conv层做的运算是一样的,都是点积,只是CONV层具有局部性而已。

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值