卷积神经网络

深度学习与计算机视觉

计算机视觉概述

计算机视觉就是让机器去识别摄像机拍摄的图片或视频中的物体,检测出物体所在的位置,并对目标物体进行跟踪,从而理解并描述出图片或视频里的场景和故事,以此来模拟人脑视觉系统。

image-20211103105348940

计算机视觉通常被叫做 机器视觉

图像识别

image-20211103110003413

测量空间:彩色图像有RGB三个通道,每一个通道由很多个像素点构成,表示图像的这些数据,我们把他叫做测量空间。

图像识别基本框架:场景识别、目标识别、人脸识别……

  • 早期图像处理

    • 用全局的视觉底层特性统计量表示图像

    • 图片表示成向量,分别是颜色特征向量,形状特征向量和纹理特征向量

  • 中期图像处理

    • 局部特征转化为视觉关键词,图片表示成视觉词袋

    • 局部检测子 来提取局部特征

    • 还有 局部描述子

  • 现在

    • 用深度学习的方法进行特征提取

      image-20211103110918175

卷积神经网络

卷积神经网络是目前计算机视觉中使用最普遍的模型结构

卷积(Convolution) ,池化(Pooling),ReLU,批归一化(BatchNorm) , Dropout

image-20211107173027675

卷积

用于特征的提取

全连接神经网络存在的问题

  • 没有体现出空间关联性。

  • 模型参数过多,容易过拟合。

image-20211107173232516

卷积计算

  • 卷积操作示意图

image-20211103212833400

卷积的特点

  • 图像上不同区域共用同样的卷积核

    • 卷积核在图片上滑动,每次将卷积核下面覆盖区域的元素

    • 与核数组对应位置的元素相乘并相加,得到输出特征图的元素

  • 卷积操作保留了空间信息

    • 空间上相邻的像素点,会被卷积核同时覆盖到,他们一起决定输出像素点的大小空间信息

    • 空间位置上相邻的像素点,他们对应的输出特征图上的点,也是接近的

    • 卷积操作保留了空间信息,有可能提取到空间位置信息中心包含的特征模式

  • 卷积核参数的个数,与输入图片大小无关

  • 除了图片像素跟卷积核的乘加操作外,卷积算子还要加上 偏置项

image-20211103213616423

image-20211103214132911

图片填充(padding)

  • 为了让输出特征图大小不变,通常会对图片进行填充

    • 填充方式是在图片周围一圈额外增加一些像素点

image-20211103213916262

image-20211103214204646

步幅(stride)

卷积核每次滑动距离为1个像素点,这是步幅为1的特殊情形

步幅为2就是卷积核每次移动2个像素点

  • 当步幅不为1时,公式如下:

image-20211103214703200

例:

image-20211103214723381

多输入通道、多输出通道和批量操作

对于彩色图片有RGB三个通道

  • 输入图片

image-20211104085750448

  • 卷积核

    image-20211104085843878

每一个通道上的卷积核是一个二维数组

对每个输入通道分别计算,并将每个通道的输出结果求和

image-20211104090001987

  • 多输出通道:输出通道的数目通常也被称作卷积核的个数

感受野(Receptive Field)

通过卷积、池化等操作获得一个特征图以后,这张特征图上的一个特征点(一个像素),受到了原输入图像上多大范围内像素的影响。

卷积神经网络每一层输出的特征图(feature map)上的像素点在输入图片上映射的区域大小。

也就是 特征图上的一个点对应输入图上的区域

  • 一般会往上面加卷积层,越往后的卷积层的特征图,越具有越高的语义含义。

卷积层堆得越多,更高级层上面的特征图,在原图上对应的感受野也就越大,这时候提取到的特征也就更具有全局性。

创建卷积算子

 #weight_attr 指定了卷积核参数的属性
 #initializer 指定初始的时候用什么值 (初始化)把 w 指定为卷积核的初始化参数
 #assign-------增加新的一列
 conv = Conv2D(in_channels=1, out_channels=1, kernel_size=[1, 3], weight_attr=paddle.ParamAttr(initializer=Assign(value=w)))

 # 将numpy.ndarray转化成paddle中的tensor或是variable
 x = paddle.to_tensor(x)
 ​
 #把x的numpy.ndarray转换形式,
 #转换成可以用在计算图里面执行的变量

查看卷积层参数

 conv.parameters() #查看卷积层所包含的参数
 ​
 # 查看卷积层的权重参数名字和数值
 print(conv.weight)
 # 参看卷积层的偏置参数名字和数值
 print(conv.bias)
 ​
 net = Lenet()
 print (net)

池化

用于使特征图变小,简化计算复杂度,进行特征压缩,提取主要特征。

  • 什么是池化:池化是使用某一位置的相邻输出的总体统计特征代替网络在该位置的输出。

  • 池化的好处:是当输入数据做出少量平移时,经过池化函数后的大多数输出还能保持不变。

  • 池化的作用:由于池化之后特征图会变得更小,如果后面连接的是全连接层,能有效的减小神经元的个数,节省存储空间并提高计算效率。

  • 池化的方法:平均池化和最大池化。

image-20211104142718756

激活函数ReLU

image-20211104150005304

image-20211104150055652

  • 优点:

    • 克服梯度消失的问题

    • 加快训练速度

注:正因为克服了梯度消失问题,训练才会快

  • 缺点

    • 输入负数,则完全不激活,ReLU函数死掉

    • ReLU函数输出要么是0,要么是正数,

注:在神经网络里,将经过反向传播之后,梯度值衰减到接近于零的现象称作梯度消失现象。

批归一化(Batch Normalization)

简称 BatchNorm

目的是对神经网络中间层的输出进行标准化处理,使得中间层的输出更加稳定。

image-20211104150615028

  • Batch Normalization 提升数值稳定性

    • 对中间层的输出做标准化,保证在网络学习过程中,网络层的输出具有稳定的分布

  • BatchNorm带来的好处

    • 可以使学习快速进行(能够使用较大的学习率)

    • 可以降低模型对初试值的敏感性

    • 可以一定程度上抑制过拟合

BatchNorm的计算

  1. 计算mini-batch内样本的均值

x(i)表示mini-batch中的第i个样本

2.计算mini-batch内样本的方差

image-20211104152835312

3.计算标准化之后的输出

image-20211104153157095

4.如果强行限制输出层的分布是标准化的,可能会导致某些特征模式的丢失,所以在标准化之后,BatchNorm会紧接着对数据做缩放和平移。

image-20211104153403794

示例一:当输入数据形状是 [N,K] 时,一般对应全连接层的输出,数据和参数对应如下:

image-20211104153602598

示例二:当输入数据形状是[N,C,H,W]时,一般对应卷积层的输出,数据和参数对应如下:

image-20211104153700992

预测时使用BatchNorm

image-20211104154305008

image-20211104154327366

image-20211104154351547

丢弃法(Dropout)

一种抑制过拟合的方法

  • 实现方法:在神经网络学习过程中,随机删除一部分神经元。训练时,随机选出一部分神经元,将其输出设置为0,这些神经元将不对外传递信号。

image-20211104155003794

assign

assign()-------------增加新的一列

np.ones()

numpy.ones()函数返回给定形状和数据类型的新数组,其中元素的值设置为1。此函数与np.zeros()函数非常相似。

np.ndarray()

array模块中的array函数不支持多维数组。

NumPy数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2。

np.ndarray:

  1. 下标从0开始。

  2. 一个ndarray数组中的所有元素的类型必须相同。

np.squeeze()

numpy.squeeze(a,axis = None)

a表示输入的数组。

axis用于指定需要删除的维度,指定的维度必须为单维度。

从数组的形状中删除单维度条目,即把shape为1的维度去掉。

plt.subplot()

 plt.subplot(221)  #指定分为2行2列 绘制在第一个位置
 plt.subplot(222)  #指定分为2行2列 绘制在第二个位置
 plt.subplot(212)  #指定分为2行1列 绘制在第二个位置
 plt.show()

np.repeat()

复制的是多维数组的每一个元素,axis来控制复制的行和列

axis

axis = o (行)

axis = 1 (列)

image-20211104111028037

repeat中使用方法:

image-20211104111116702

image-20211104111132918

image-20211104111210525

np.transpose

作用是改变序列

对于矩阵的变化,就是交换了 x 轴 y 轴

在 transpose 中的参数 (1,0,2) 可看作 (y,x,z) ,也就是 x 对应 0 ,y 对应 1 ,z 对应 2

比如原先 3 的坐标为(0,1,0)交换了 x y 之后变成了(1,0,0)

查看LeNet中所包含的子层

 # 输入数据形状是 [N, 1, H, W]
 # 这里用np.random创建一个随机数组作为输入数据
 x = np.random.randn(*[3,1,28,28])
 x = x.astype('float32')
 ​
 # 创建LeNet类的实例,指定模型名称和分类的类别数目
 m = LeNet(num_classes=10)
 # 通过调用LeNet从基类继承的sublayers()函数,
 # 查看LeNet中所包含的子层
 print(m.sublayers())
 x = paddle.to_tensor(x)
 for item in m.sublayers():
     # item是LeNet类中的一个子层
     # 查看经过子层之后的输出数据形状
     try:
         x = item(x)
     except:
         x = paddle.reshape(x, [x.shape[0], -1])
         x = item(x)
     if len(item.parameters())==2:
         # 查看卷积和全连接层的数据和参数的形状,
         # 其中item.parameters()[0]是权重参数w,item.parameters()[1]是偏置参数b
         print(item.full_name(), x.shape, item.parameters()[0].shape, item.parameters()[1].shape)
     else:
         # 池化层没有参数
         print(item.full_name(), x.shape)

结果:

image-20211107173924651

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值