单个感知机能够实现逻辑与、或,能实现自我学习。多个感知机组合能够实现逻辑异或。
就是一个巨大的复合函数!!!
多个感知机连在一起形成级联神经网络为“多层前馈神经网络”。
激活函数能将输出转化为非线性,使得神经网络能够解决任意非线性问题。
用来做二分类,将任意实数映射到(0,1)区间。
优点:平滑,易于求导。
缺点:激活函数计算量大,容易出现梯度消失。
优点:**在特征明显时候效果会很好,在循环过程中会不断扩大特征效果。**关于原点对称,收敛速度比sigmoid函数快,能减少迭代次数。
缺点:容易造成梯度消失。
优点:更有效率的梯度下降与反向传播,避免了梯度消失与梯度爆炸。 由于小于0部分为0,大于0部分才有值,所以可以减少过拟合。
缺点:由于学习率初始太大,可能造成神经元坏死现象,小于零的部分神经元会永远死亡。常用与回归模型。
S i = e V i ∑ i c e V i S_i=\frac{e^{V_i}}{\sum_{i}^ce^{V_i}} Si=∑iceVieVi
归一化指数函数,将K维向量压缩,使得每一个元素范围都在(0-1)之间,并且所有元素和为1。常用与分类最后一层做多分类。
函数意义:当前元素指数与所有元素指数和的比值。
通过计算预测值与真实值之间差异构成损失函数,通过梯度下降优化损失函数值,优化模型参数。
tk表示真实值,yk表示实际认为的分布(非真实分布)情况。
熵越大,不确定性越大。最小值为最小信息熵,也就是最优。
梯度为一个向量,变化最快,变化率最大。
通过梯度下降来优化神经元的预测效果。学习率控制下降的步幅。
(1)批量梯度下降(BGD):能更好的表示样本总体。但是计算量很大。
(2)随机梯度下降(SGD):计算速度非常快,准确度下降,下降过程是非线性的,震荡大。
(3)小批量梯度下降(MBGD):计算速度适中,准确度也有一定保证。
上图可以看出,反向传播计算导数时候,在输出端梯度的模值,经过回传扩大了3~4倍。
梯度爆炸:反向传播结果的数值大小不止取决于求导的式子,很大程度上也取决于**输入的模值。**当计算图每次输入的模值都大于1,那么经过很多层回传,梯度将不可避免地呈几何倍数增长,直到Nan。
梯度消失: 每个阶段输入的模恒小于1,那么梯度也将不可避免地呈几何倍数下降,直到0。
由于人为的参数设置,梯度更倾向于消失而不是爆炸。BN作用本质上就是控制每层输入的模值。
神经信号的传播要在最后才能知道与真实结果的偏差,才能通过梯度下降进行优化。但是隐藏层却无法正向得到误差,所以只有通过反向传播来优化参数。
正向的边可以确定,通过自变量变动1个单位所引起的输出的变化,可以确定隐藏层各条边的导数值。
导数值可以通过定义求到,也可以根据公式求到,输出项的导数等于1。还可以等于上一个反向导数值,乘以对边正向数字。
因为深层神经网络在做非线性变换前的激活输入时,值会随着网络深度加深,其分布逐渐往非线性函数的取值区间的上下限两端靠近,会向上或者向下,这导致反向传播时低层神经网络的梯度消失。
BN不仅仅对输入层做标准化处理,还对网络的每一中间层的输入(激活函数前)做归一化处理,使得输出服从均值为0,方差为1的正态分布,从而避免变量分布偏移的问题,也就避免了向激活函数上下靠近。
1.避免梯度消失和梯度爆炸。把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样可以让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
2.加快训练速度。
3.提高模型泛化能力。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xe4MXVe1-1652190756808)(.\deep_nlp_images\nn1.png)]
然而,当一个Epoch的样本(也就是所有的训练样本)数量可能太过庞大(对于计算机而言),就需要把它分成多个小块,也就是就是分成*多个Batch 来进行训练。*
举个例子:
mnist 数据集有60000张图片作为训练数据,10000张图片作为测试数据。假设现在选择 Batch_Size = 100对模型进行训练。迭代30000次。
TensorFlow是一种**”符号式编程框架**”,首先要构造一个图(graph),然后在会话(Session)上根据这个图做真实的运算(op)。打个比方,graph就像多条生产线,session就像生产者。生产线具有一系列的加工步骤(加减乘除等运算),生产者把原料投进去,就能得到产品。不同生产者都可以使用这条生产线,只要他们的加工步骤是一样的就行。同样的,一个graph可以供多个session使用,而一个session不一定需要使用graph的全部,可以只使用其中的一部分。
在tensorflow中,即使是最基本的对象Tensor(张量)也需要在Session中才能得到其值,而不能企图通过python一样的方式直接得到其结果。
graph即tf.Graph(),session即tf.Session(),是两个完全独立的概念。
下图是用tensorflow制作大盘鸡和红烧肉的过程,以此为例来说明graph和session的区别:
左图中绿色矩形为数据,黄色圆圈为中间结果,红色圆圈为最终结果,这是一个完整的制作大盘鸡和红烧肉的graph(相当于是一个菜谱),图中每一个独立单元都可以看成是一个op(操作,包括数据)。在tensorflow中只有graph是没法得到结果的,这就像只有菜谱不可能得到红烧肉是一个道理。于是就有了tf.Session(),他根据graph制定的步骤,将graph变成现实。
tf.Session()就相当于一个厨师长,他下面有很多办事的人(Session()下的各种方法),其中有一个非常厉害厨师叫tf.Session.run(),他不仅会烧菜,还会杀猪、酿酒、制作酱料等一系列工作,比如:
我的酱料 = sess.run(酱料):run收到制作“酱料”的命令,于是他看了下graph,需要“酵母”和“大豆”来制作酱料,最终他把酱料制作好了(这里酵母和大豆是graph定义好的,但也可以根据自己的喜好来换)。
我的料酒 = sess.run(料酒,feed_dic={米:泰国籼米}):run又收到要制作“料酒”的命令,而且不用graph规定的“米”来做,需要用“泰国籼米”,没关系,run跑去买了泰国籼米,又把料酒给做了。
我的红烧肉 = sess.run(红烧肉):傍晚,run又收到了做一份完整红烧肉的命令,这下他有的忙了,必须将整个流程走一遍,才能完成个任务。
我的大盘鸡 = sess.run(大盘鸡): 后来,run又收到做大盘鸡的任务,这是一个独立的任务,跟红烧肉没有半点关系,但不影响,他只要按照步骤照做就可以了。
Session运行参数配置
config = tf.ConfigProto(allow_soft_placement=True, log_device_placement=True)
# log_device_placement = True ,可以获取到 operations 和 Tensor 被指派到哪个设备(几号CPU或几号GPU)上运行,会在终端打印出各项操作是在哪个设备上运行的。
# allow_soft_placement=True,允许tf自动选择一个存在并且可用的设备来运行操作。
config.gpu_options.per_process_gpu_memory_fraction = 0.4
# 设置占用40%GPU显存
sess = tf.Session(config=config)
动态申请显存
config = tf.ConfigProto()
config.gpu_options.allow_growth = True # 动态申请显存,需要多少就申请多少。
session = tf.Session(config=config)
限制GPU使用率
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.4 # 限制GPU的使用率。占用40%GPU显存
session = tf.Session(config=config)
5 × 5 × 3的filter对原始3通道图像进行特征提取,结果为3通道特征层。同一卷积层的各个filter维度应该一样,但是可以用多个卷积层来进行特征提取!!!
有w权重与b偏置参数的层后面(经过一次计算之后)都会需要加入一个非线性变换(relu处理函数)!!!
带参数计算的结构才能称为一层神经网络(卷积、全连接都算)!!!
由于全连接层需要固定大小输入向量,所以卷积层也需要固定大小输入。
输出矩阵大小:
O H = H + 2 P − F H S + 1 OH=\frac{H+2P-FH}{S}+1 OH=SH+2P−FH+1
O W = W + 2 P − F W S + 1 OW=\frac{W+2P-FW}{S}+1 OW=SW+2P−FW+1
OH为输出的高,OW为输出的宽。P是填充,FH是滤波器大小(一个滤波器为5 × 5 × 3大小),S是步幅。
全连接网络层缺点:(1)数据必须为一维数据,破坏了多维数据的空间结构,会影响数据特征提取。(2)全连接网络参数量太大。(3)深度受限,一般不超过7层。
卷积层:通过卷积运算达到降维、提取特征两个目的。卷积后还会改变通道数量。主要参数有:(步长、padding、卷积核大小、卷积核个数)
padding:卷积运算中,越中间的值对特征贡献度越大,所以为了使边界点能够在卷积运算中被更多的利用到,所以设置了zero_padding大小,一定程度上弥补边界特征信息利用不充分的问题,并且不会对最终结果产生任何影响!!!
卷积核个数:最后想要得到多少个特征图!!!
激活层:将前一层的线性输入,通过非线性激活函数后,转变成非线性,可以模拟任何函数。ReLU使用最多,因为收敛快,不存在梯度消失。
池化层:没有学习参数,可以减低计算量,提高泛化能力,通道数不会发生变化,对微小的位置变化不会影响输出结果(健壮性)。降维、提高模型泛化能力。Max池化、average池化。池化后的数据特征明显,但是会损失一些特征值!!!VGG网络通过卷积核个数翻倍的方式来弥补特征值损失!!!
全连接层:起到分类器的作用。通过前面卷积-激活-池化后,数据维度已经大幅度下降,待处理数据特征提取得很明显了,再通过全连接层后进行分类能够得到较好的分类结果。
在卷积神经网络中,感受野是卷积神经网络每一层输出的特征图上的像素点在输入图片上映射的区域大小。再通俗点的解释是,特征图上的一个点对应输入图上的区域。感受野越大越好,说明这个特征越能代表输入!!!
使用3*3的卷积核连续卷积2次可以达到5*5的卷积核卷积1次提取特征图的能力;使用3*3的卷积核连续卷积3次可以达到7*7的卷积核卷积1次提取特征图的能力;
(1)增加了层数,卷积层数越多特征提取越细致,整合了三个非线性激活层,代替单一非线性激活层,增加了判别能力。
(2)减少了网络参数。以3个3×3的级联卷积代替1个7×7的卷积为例:可以减少7×7-3×3×3=22个参数,减少了45%的参数。
(3) 减少了计算量。 以3个3×3的级联卷积代替1个7×7的卷积为例:可以减少7×7×L-3×3×3×L=22×L次计算,减少了45%的计算量。
全连接层与层之间是稠密的连接结构。 在卷积神经网络中,卷积核尺度远小于输入的维度,这样每个输出神经元仅与前一层特定局部区域内的神经元存在连接权重,这就是稀疏交互。
稀疏交互的物理意义:通常图像、文本、语音等现实世界中的数据都具有局部的特征结构, 我们可以先学习局部的特征, 再将局部的特征组合起来形成更复杂和抽象的特征。
给定一张输入的图,用同一个filter去卷积这张图,卷积核参数就是权重,这张图的每个位置都是被同一个filter卷积,这就是参数共享。
如果我们的输出是给出图片中猫的位置,那么我们将图片中的猫从左边移到右边,这种平移也会反应在输出上,我们输出的位置也是从左边到右边,那么我们则可以说CNN有等变性 。
#### 滑动窗口
一个个小窗口作为候选框,进行分类和定位回归。
step0:生成区域集R
step1:计算区域集R里每个相邻区域的相似度S={s1, s2,…}
step2:找出相似度最高的两个区域,将其合并为新集,添加进R
step3:从S中移除所有与step2中有关的子集
step4:计算新集与所有子集的相似度
step5:跳至step2,直至S为空
首先对产生很多的小子区域,然后通过子区域的相似性合并。
结束条件:先算出一个S为所有候选区的相识度对,选出最大相似的合并,删除相关候选集,合并后放入R集合中,再将合并的与其他两两求相似,再放入S中循环迭代。
为预测结果的置信概率, p c p_c pc为置信概率、 b x b_x bx、 b y b_y by为边框坐标, b w b_w bw、 b h b_h bh为图片宽高, c 1 c_1 c1、 c 2 c_2 c2、 c 3 c_3 c3为属于某个类别的概率。通过预测结果、实际结果,构建损失函数。损失函数包含了分类、回归两部分组成。
使用IoU(交并比)来判断模型的好坏。所谓交并比,是指预测边框、实际边框交集和并集的比率,一般约定0.5为一个可以接收的值。
多个预测结果间存在重叠部分,只需要保留交并比最大的结果,这就是非极大值抑制(NMS)。
利用选择性搜索算法提取大约2000个候选区,将每个候选区送到CNN进行特征提取,然后将提取的特征送入svm进行目标和背景二分类。再利用回归算法进行边框回归。
缺点:每个候选区都要经过CNN的重复特征提取大约花费47秒,选择性搜索方法生成候选区需要花费2秒 。并且三个模块(提取、分类、回归)是分别训练,占用空间大。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eRQva6M3-1652190756809)(.\deeplearning_note_imgs\fastrcnn.png)]
读入一张图像,一路送入CNN进行特征提取,输出特征图,另一路通过选择性搜索生成大约2000个候选区 (r, c, h, w) 。把候选区的坐标系映射到特征图上,再把候选区窗口框起来的各个特征图输入到RoIPooling,得到固定7*7大小的输出。再经过两个全连接得到特征,将IOU>=0.5的候选区使用softmax分类,使用平滑的L1-loss进行窗口回归。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hpu6b0de-1652190756810)(.\deeplearning_note_imgs\roipooling.jpg)]我们有一个8$ 8 大 小 的 特 征 图 , 一 个 ( 0 , 3 ) , ( 7 , 8 ) 候 选 框 , 以 及 输 出 大 小 为 2 8大小的特征图,一个(0,3),(7,8)候选框,以及输出大小为2 8大小的特征图,一个(0,3),(7,8)候选框,以及输出大小为2$2。
找到候选框在特征图上面的投影位置(左上角,右下角坐标):(0,3),(7,8)。将其划分为(2$$2)个sections(因为输出大小为22),再对每个section进行max池化。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9YykPF4E-1652190756810)(.\deeplearning_note_imgs\fasterrcnn.jpg)]
在Faster RCNN卷积层中对所有的卷积都做了扩边处理(pad=1),再做3x3卷积后输出MxN,不改变输入和输出矩阵大小。经过4个pooling之后,输出特征图为原图像的 1 16 \frac{1}{16} 161,这样就能将特征图与原图相对应。
区域生成网络 Region Proposal Networks(RPN):卷积后的特征图,每个点设置9个锚点(进行多尺度检测),上面一条通过softmax对锚点进行目标和背景分类,下面一条用于计算对于各个锚点的边框偏移量,以获得精准的候选区域。 最后的Proposal层将前面两个结果结合候选区域特征图,同时剔除太小和超出边界的候选框。再将候选特征图送入全连接层进行分类和回归。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zzwdZ8hM-1652190756810)(.\deeplearning_note_imgs\yolov1.png)]
给定一个输入图像,将图像缩放到448×448,然后将图像划分成7×7的网格。对于每个网格可以预测2个bbox,每个box包含(x,y,w,h,置信度)5个预测量(x,y为物体中心点相对于各子位置的偏移量,置信度为物体置信概率(0或1)与IOU的乘积),以及20个类别概率,总共输出7×7×(2×5+20)=1470个张量。根据上一步可以预测出7×7×2=98个目标窗口,再通过NMS去除冗余窗口即可得到最终结果。然后将最终结果进行回归,损失函数有三部分:(x,y)坐标的误差+交并比误差+分类误差。
流程:
第一阶段:现在ImageNet分类数据集上训练Darknet-19,此时模型输入为224×224,共训练160轮。
第二阶段:将网络输入调整为448×448,继续在ImageNet分类数据集上训练细调模型,共10轮, 此时分类模型top-1准确率为76.5%,而top-5准确度为93.3%
第三阶段:修改Darknet-19分类模型为检测模型,并在检测数据集上继续细调网络。
改进:
(1)在每个卷积层后加BN(批量正则化)层,BN层能提升模型收敛速度,防止模型过拟合与梯度弥散。
(2)高分辨率分类器。YOLO网络在ImageNet上面预训练的时候采用224×224的输入,但是在预测的时候却是448×448的输入,这会导致检测模型的时候不适应图像分辨率的改变。而YOLOv2则将预训练分成两步:先224×224的输入从头开始训练160个批次,然后再在ImageNet数据集上将输入调整到448×448训练10个批次。最后再将模型用于检测。
(3)利用锚点预测边界框。YOLOv1利用全连接层直接对边界框进行预测,导致丢失较多空间信息,定位不准。YOLOv2去掉了YOLOv1中的全连接层,使用Anchor Boxes预测边界框。由于图片中的物体都倾向于出现在图片的中心位置,为了使特征图正好有中心位置进行预测,所以使用416×416的输入,最后得到13×13的特征图,然后每个特征图预测5个anchor boxes。
(4)YOLOv2采用Darknet-19,包括19个卷积层和5个max pooling层,主要采用3×3卷积和1×1卷积,这里1×1卷积可以压缩特征图通道数以降低模型计算量和参数,每个卷积层后使用BN层以加快模型收敛同时防止过拟合。最终采用global avg pool 做预测。
优点:
YOLOv2较多使用了3×3卷积核,在每次池化后操作后把通道数翻倍。网络使用了全局平均池化,把1×1卷积核置于3×3卷积核之间,用来压缩特征。也用了batch normalization稳定模型训练。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u501bdM5-1652190756810)(.\deeplearning_note_imgs\yolov3.png)]
YOLOv3将输入图像分成S×S个格子,每个格子预测B个bounding box,每个bounding box预测内容包括:(x, y, w, h,Confidence Score,C个类别的概率),因此YOLOv3输出层的channel数为B×(5 + C)。YOLOv3的loss函数也有三部分组成:Location误差,Confidence误差和分类误差。用逻辑回归替代softmax作为分类器。
(1)特征提取网络。YOLOv3使用 DarkNet53作为特征提取网络:DarkNet53 基本采用了全卷积网络,用步长为2的卷积操作替代了池化层,同时添加了Residual单元,避免在网络层数过深时发生梯度弥散。
(2)特征融合层。为了解决之前YOLO版本对小目标不敏感的问题,YOLOv3采用了3个不同尺度的特征图来进行目标检测,分别为13×13,26×26,52×52,用来检测大、中、小三种目标。特征融合层选取DarkNet产出的三种尺度特征图作为输入,借鉴了FPN(feature pyramid networks)的思想,通过一系列的卷积层和上采样对各尺度的特征图进行融合,实现多尺度检测 ,增强了对小物体的检测能力。
YOLOV3网络结构:
YOLOV3先将图片划分为S×S的网格,每个网格有3个预测框。每个预测框拥有五个预测量和对于各个类别的概率值。如果物体中心落日了一个网格,那么这个网格就负债预测这个物体。通过IOU和非极大值抑制选出最终预测的预测框。DarkNet53为全卷积层网络结构,没有使用全连接层,用strip为2的卷积层代替池化层来进行下采样。采用特征金字塔结构来增强对不同大小物体的检测能力,同时当前层的特征图进行上采样后与上一层的特征图融合实现对尺度检测。 使用了残差结构, 在之前学习的特征的基础上添加某些特征,来获得更好的特征。H(x)=F(x)+x,其中x是开始时的传入特征,而F(x)就是对x进行的填补与增加,成为残差。因此学习的目标就从学习完整的信息,变成学习残差了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dc02LXGp-1652190756811)(.\deeplearning_note_imgs\crnnctc01.jpg)]
将图片上的文字看成一个整体,然后以weight来划分时间序列。
(1)在进入网络之前,所有的图像需要缩放到相同的高度。然后通过标准CNN模型(去除全连接层)中的卷积层和最大池化层来构造卷积层的组件。这样的组件用于从输入图像中提取序列特征表示。
(2)CTC是一种Loss计算方法,用CTC代替Softmax Loss,训练样本无需对齐。CTC特点:引入blank字符,解决有些位置没有字符的问题。
一般情况下对一张图像中的文字进行识别需要以下步骤:
# tensorflow实现CTC接口
tf.nn.ctc_loss(
labels,
inputs,
sequence_length,
preprocess_collapse_repeated=False,
ctc_merge_repeated=True,
ignore_longer_outputs_than_inputs=False,
time_major=True)
常见的特征工程工具:Tsfresh、Trane、Categorical Encoding、boruta_py、Featuretools。
专注特征工程的 FeatureLab 。
特征工程工具总结(4)——boruta_py
特征工程工具总结(5)——Featuretools
常见的超参优化工具:Skopt、Hyperopt、Simple(x)、Ray.tune、Chocolate、GpFlowOpt、FAR-HO、Xcessiv、HORD、ENAS、NNI
超参优化工具评分如下:
常见的AML框架:MLBox、Autokeras、TPOT、H2O、Auto_ml
除了AutoKeras,其余框架均对特征工程有较强的支持,但支持的模型大多是传统机器模型。AutoKeras对神经网络支持较好,也因此对特征工程要求较低,它也是五种框架中唯一支持NAS的框架。
深度解析AutoML框架——Autokeras:入门指南
深度解析AutoML框架——TPOT:一键生成ML代码,释放双手
深度解析AutoML框架——H2O:入门指南
深度解析AutoML框架——Auto_ml:初识AutoML的引路人
超参优化工具总结(2)——Hyperopt
超参优化工具总结(3)——Simple(x)
超参优化工具总结(4)——Ray.tune
超参优化工具总结(5)——Chocolate
超参优化工具总结(6)——GpFlowOpt
超参优化工具总结(7)——FAR-HO
超参优化工具总结(8)——Xcessiv
超参优化工具总结(9)——HORD
超参优化工具总结(10)——ENAS
as,其余框架均对特征工程有较强的支持,但支持的模型大多是传统机器模型。AutoKeras对神经网络支持较好,也因此对特征工程要求较低,它也是五种框架中唯一支持NAS的框架。
[外链图片转存中…(img-99rNxPPu-1652190756812)]
深度解析AutoML框架——Autokeras:入门指南
深度解析AutoML框架——TPOT:一键生成ML代码,释放双手
深度解析AutoML框架——H2O:入门指南
深度解析AutoML框架——Auto_ml:初识AutoML的引路人
超参优化工具总结(2)——Hyperopt
超参优化工具总结(3)——Simple(x)
超参优化工具总结(4)——Ray.tune
超参优化工具总结(5)——Chocolate
超参优化工具总结(6)——GpFlowOpt
超参优化工具总结(7)——FAR-HO
超参优化工具总结(8)——Xcessiv
超参优化工具总结(9)——HORD
超参优化工具总结(10)——ENAS
超参优化工具总结(11)——NNI