深度学习.
·
深度学习
- 计算机视觉
(1)应用领域:图片猫🐱识别,目标检测(无人驾驶),图像风格转换(比如转成素描)等等。
(2)面临的挑战:
数据的输入量可能会非常大,例如一张1000×1000的图片,特征向量的维度达到了1000×1000×3(RGB,3通道) = 300万
神经网路中涉及的参数比较多,例如在神经网络中,你也许会有1000个隐藏单元,使用标准的全连接网络,这个矩阵将会含有1000×300万,即30亿个参数。
① 如此大量的参数情况下,难以获得足够的数据来防止神经网络发生过拟合
② 处理30亿参数的神经网络所需的巨大内存难以应对 - 边缘检测示例

import numpy as np
image = np.array([[3,0,1,2,7,4],[1,5,8,9,3,1],[2,7,2,5,1,3],[0,1,3,1,7,8],[4,2,1,6,2,8],[2,4,5,2,3,9]])
print(image)
print('-------')
filter_ = np.array([[1,0,-1],[1,0,-1],[1,0,-1]])
print(filter_)
print('-------')
from scipy import signal
convolution = -signal.convolve2d(image,filter_,boundary='fill',mode='valid')
print(convolution)

检测边缘实例:

image = np.array([[10,10,10,0,0,0],[10,10,10,0,0,0],[10,10,10,0,0,0],[10,10,10,0,0,0],[10,10,10,0,0,0],[10,10,10,0,0,0]])
filter_ = np.array([[1,0,-1],[1,0,-1],[1,0,-1]])
print(-signal.convolve2d(image,filter_,boundary='fill',mode='valid'))
[[ 0 30 30 0]
[ 0 30 30 0]
[ 0 30 30 0]
[ 0 30 30 0]]
- 更多边缘检测
可以检测明暗变化方向

竖直,水平的过滤器

把这9个数字当成参数,通过反向传播学习,边缘捕捉能力会大大增强(可以检查任意角度) - Padding
假设原始图片是 n × n ,过滤器是 f × f ,那么输出大小是 ( n − f + 1 ) × ( n − f + 1 ) 。
缺点1,图像每做一次卷积,缩小一点,最后变得很小
缺点2,在角落或边缘区域的像素点在输出中采用较少,丢失了图像边缘位置的许多信息
解决上面的问题:
进行卷积操作前,沿图像边缘填充 p 层像素,令 ( n + 2 ∗ p ) − f + 1 = n ⇒ p = f − 1 /2,这样可以保持图像大小不变,同时也使得边缘信息发挥作用较小的缺点被削弱
填充多少层,怎么选?
对于Valid 卷积:p = 0不需,要填充
对于Same 卷积: p = f − 1 /2 ,f 通常是奇数(对称填充,有中心点) - 卷积步长
每次过滤器在图片中移动的步长为s(stride)
输出尺寸为
- 三维卷积

输出是一个二维的,每个格子里是对应着 27个元素求和
如果希望对不同的通道进行检测边缘,对 filter 的相应层设置不同的参数就可以了
想要多个过滤器怎么办?(竖直的、水平的,各种角度的)

- 单层卷积网络
参数的个数跟图片大小无关,跟过滤器相关,假如有10个过滤器,上面每个过滤器有 27 个参数,加上偏置 b,28个再乘以10,共计280个参数。
即使图片很大,参数却很少,这也是卷积神经网络的一个特征,叫作避免过拟合。

- 简单卷积网络示例

- 池化层
除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性
Max 运算的实际作用:
如果在过滤器中提取到某个特征,那么保留其最大值
如果没有提取到这个特征,例如在右上象限中这个特征就不明显,其最大值也还是很小
池化,它有一组超参数 f , s f,sf,s,但没有参数需要学习,不需要梯度下降更新
池化层特征
(1)最大池化比平均池化更常用
(2)常用的参数值为f = 2 or 3 ,s=2
(3)最大池化时,很少用到 padding(即 p = 0 p=0p=0)
(4)池化层前后的输入输出通道数一样
(5)最大池化只是计算神经网络某一层的静态属性,没有需要学习的参数 - 卷积神经网络示例

尽量不要自己设置超参数,而是查看文献中别人采用了哪些超参数,选一个在别人任务中效果很好的架构,它也有可能适用于应用程序。 - 为什么使用卷积?
和只用全连接层相比,卷积层 的两个主要优势在于参数共享和稀疏连接,全连接层的参数巨大,卷积层需要的参数较少。
原因:
参数共享,特征检测如果适用于图片的某个区域,那么它也可能适用于图片的其他区域
使用稀疏连接,一个输出仅依赖少部分的输入
神经网络可以通过这两种机制减少参数,以便我们用更小的训练集来训练它,从而预防过度拟合。 - 为什么要进行实例探究
学习前辈们组建网络的方法,借鉴过来解决自己的问题。
经典的网络模型:
LeNet-5
AlexNet
VGG
ResNet
Inception - 经典网络



- 残差网络 ResNets
非常非常深的神经网络是很难训练的,因为存在梯度消失和梯度爆炸问题

中间的激活能够到达网络的更深层
这种方式确实有助于解决梯度消失和梯度爆炸问题,让我们在训练更深网络的同时,又能保证良好的性能
ResNet 在训练深度网络方面非常有效 - 残差网络为什么有用
残差网络起作用的主要原因:
残差块学习恒等函数非常容易,能确定网络性能不会受到影响,很多时候甚至可以提高效率,或者说至少不会降低网络的效率. - 网络中的网络 以及 1×1 卷积

可以通过池化层来压缩输入的高度和宽度,但是池化层不改变通道数
1×1卷积层 给神经网络添加了一个非线性函数,从而减少或保持输入层中的通道数量不变,也可以增加通道数量 - 谷歌 Inception 网络简介
构建卷积层时,你要决定过滤器的大小究竟是1×1,3×3 还是 5×5,要不要添加池化层。
而 Inception网络 的作用就是代替你来决定,虽然网络架构变得更加复杂,但网络表现却非常好
基本思想是:
Inception 网络不需要人为决定使用哪个过滤器或者是否需要池化,而是由网络自行确定这些参数,你可以给网络添加这些参数的所有可能值,然后把这些输出连接起来,让网络自己学习它需要什么样的参数,采用哪些过滤器组合
通过使用1×1卷积来构建瓶颈层,从而大大降低计算成本。

18.使用开源的实现方案
事实证明很多神经网络复杂细致,因而难以复制,因为一些参数调整的细节问题,例如学习率衰减等等,会影响性能
选择一个喜欢的神经网络框架
接着寻找一个开源实现,从GitHub下载下来,以此基础开始构建
这样做的优点在于,这些网络通常都需要很长的时间来训练,而或许有人已经使用多个GPU,通过庞大的数据集预先训练了这些网络,你就可以使用这些网络进行迁移学习 - 数据增强 Data augmentation
数据扩充是经常使用的一种技巧来提高计算机视觉系统的表现
垂直镜像对称(常用)
随机裁剪(常用)
旋转,剪切(局部扭曲)(不常用)
色彩转换(给RGB通道按分布加上失真值),使得算法对照片的颜色更改更具鲁棒性
常用的实现数据扩充的方法:
使用一个线程或者是多线程,用来加载数据,实现变形失真
然后传给其他的线程或者其他进程,来训练,可以并行实现
数据扩充过程中也有一些超参数,比如,颜色变化,随机裁剪参数。
另外,可以使用别人的开源实现,了解他们如何实现数据扩充。也可以自己去调整这些参数
更多推荐


所有评论(0)