神经网络基础模型简介



  • 神经网络讲解

    这里相当于是对我接触过的所有神经网络的一个总结。可能包括强化学习,图像处理,视频处理等各个方面。主要是针对于每个网络相对于前者都做出了怎样的改进,有什么特别值得注意的地方,每个网络都有对应的论文,都在我电脑的文件夹里面。也希望这个总结能够帮我梳理这些年来接触的网络。对自己在神经网络的理解上更进一步。

    数据集的介绍

    数据集是训练网络的前提。特别是在各个论文的最后都出现了不同的网络在某某数据集下的测试。这里我们来介绍一下,当然数据集的种类是在是太多了,我这里就介绍经常遇到的几个数据集。

    名称 内容
    MNIST 1-10的手写数字数据集,也是开头学习的最基本的数据集
    CIFAR 有CIFAR-10与CIFAR-100两种,分别对应的是10类和100类,都是三通道的彩色图像
    PASCAL VOC 也是比赛用的数据集。常用的有VOC2007与VOC2012两种数据集。有20类(加上背景21类)
    COCO 是微软出资标注的一个数据集,被应用于比赛中,类别众多,包括91类目标等等。
    Imagenet 这也是一个比赛用的数据集,与李飞飞有关。它是一个持续的研究工作。总共有21841个类别,现在肯定还在增加。

    机器学习的介绍

    机器学习包括很多部分,其中就包括深度学习和强化学习。下面就来介绍一下。

    机器学习实际上已经存在了几十年或者也可以认为存在了几个世纪。追溯到17世纪,贝叶斯拉普拉斯关于最小二乘法的推导和马尔可夫链,这些构成了机器学 习广泛使用的工具和基础。1950年(艾伦.图灵提议建立一个学习机器)到2000年初 (有深度学习的实际应用以及最近的进展,比如2012年的AlexNet),机器学习有了很大的进展。机器学习是研究怎样使用计算机模拟或实现人类学习活动的科学,是人工智能中最具智能特征,最前沿的研究领域之一。

    机器学习有很多的分类:

    1. 基于学习策略的学习:

      1. 模拟人脑的学习:符号学习,神经网络的学习
      2. 直接采用数学方法的机器学习:统计机器学习
    2. 基于学习方法的分类:

      1. 归纳学习
      2. 演绎学习
      3. 类比学习
      4. 分析学习
    3. 基于学习方法的学习:

      1. 监督学习
        1. 无监督学习
    4. ...等等

    这些类别中间没有明确的界限,但是我们常常知道的就是深度学习,强化学习,和传统的机器学习。我们可以列举一些机器学习常用的十大算法:决策树,随机森林,逻辑回归,SVM(支持向量机),朴素贝叶斯,k最近邻算法,k均值算法,Adaboost算法,神经网络,马尔可夫...

    模型的激活函数

    这个地方《深度学习实战》这本书有很详细的讲解

    relu

    sigmoid

    softmax

    模型的损失函数

    难道损失函数只有(y'-y)^2(MSE)了吗?不是的,不同的问题有不同的激活函数。比如说什么二分类问题,多分类问题,多标签问题等都有不同的损失函数。

    分类问题

    基于逻辑回归(sigmoid)的二分类/多标签问题

    逻辑回归:
    hθ(x)=g(θTx)=11+eθTxh_{\theta}(x)=g\left(\theta^{T} x\right)=\frac{1}{1+e^{-\theta^{T} x}}逻辑回归与sigmoid是一样的。最后的输出在0,1之间。

    对数损失,又叫对数似然损失,也叫做逻辑回归损失,或是交叉熵损失L(Y,P(YX))=logP(YX)=1Ni=1Nj=1Myy¯log(py¯)L(Y, P(Y | X))=-\log P(Y | X)=-\frac{1}{N} \sum_{i=1}^{N} \sum_{j=1}^{M} y_{\bar{y}} \log \left(p_{\bar{y}}\right)

    <u>为什么用log</u>

    概率之间的连乘不好计算且消耗计算资源,所以去自然对数ln,下面的log的底数就是自然对数e

    二分类是{0,1}的分类,我们采用交叉熵损失函数\operatorname{L}\left(h_{\theta}(x), y\right)=\left{\begin{array}{ll}
    -\log \left(h_{\theta}(x)\right) & \text { if } y=1 \
    -\log \left(1-h_{\theta}(x)\right) & \text { if } y=0
    \end{array}\right.,合并之后我们可以得到\operatorname{L}\left(h_{\theta}(x), y\right)=-\frac{1}{N} \sum_{i=1}^{N}(y_{i} \log \left(h_{\theta}(x)\right)+\left(1-y_{i}\right) \log \left(1-h_{\theta}(x)\right)),前面就是逻辑回归这个样子的最终损失函数。

    多标签就是每个标签进行二分类。

    基于softmax的多分类问题

    softmax:a_{j}^{L}=\frac{e^{z_{j}^{L}}}{\sum_{k} e^{z_{k}^{L}}},最后的输出也在0,1之间,且所有的概率和为1。

    多分类问题的话,我们采用对数似然损失函数

    C=-\sum_i(y_iloga_i)

    上面两个损失函数其实是对应不同的输出层,其实本质上都是一样的。

    归纳:

    tensorflow中自带的cross_entropy损失函数:(labels输入的都是实际的标签,logits输入的是神经网络最后一层的输出)

    1. tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None,labels=None,logits=None)

      _sentinel:本质不用的参数

      labels:一个和logits具有相同的数据类型(type)和尺寸形状(shape)的张量(tensor)

      shape:[batch_size,num_classes],单样本是[num_classes]

      logits:一个数据类型(type)是float32或float64的张量

      name:操作的名字,可填可不填

    适用的情况: 每个类别相互独立但互不排斥的情况:例如一幅图可以同时包含一条狗和一只大象 或是二分类问题。

    函数的两个步骤:

    1.sigmoid(x)i=y_i=\frac{1}{1+e^{-x_i}}\
    2.H
    {y'}(y)=-\sum_i[y'*logy_i+(1-y')*log(1-y_i)]

    1. tf.nn.weighted_cross_entropy_with_logits(targets,labels,logits,pos_weight,name=None)

      计算具有权重的sigmoid交叉熵sigmoid_cross_entropy_with_logits()

      _sentinel:本质上是不用的参数,不用填

      labels:一个和logits具有相同的数据类型(type)和尺寸形状(shape)的张量(tensor)

      shape:[batch_size,num_classes],单样本是[num_classes]

      logits:一个数据类型(type)是float32或float64的张量

      pos_weight:<u>正样本的一个系数</u>

      name:操作的名字,可填可不填

      函数的两个步骤:

      1.sigmoid(x)i=y_i=\frac{1}{1+e^{-x_i}}\
      2.H
      {y'}(y)=-\sum_i(pos_weight*y'*logy_i+(1-y')*log(1-y_i))

    2. tf.nn.softmax_cross_entropy_with_logits(_sentinel=None,labels=None,logits=None,dim=-1,name=None)

      _sentinel:本质上是不用的参数,不用填

      labels:每一行labels[i]必须是一个有效的概率分布,one_hot=True(向量中只有一个值为1,其他值为0)

      logits:labels和logits具有相同的数据类型(type)和尺寸(shape)

      shape:[batch_size,num_classes],单样本是[num_classes]

      name:操作的名字,可填可不填

    适用的情况: **每个类别相互独立且排斥的情况,一幅图只能属于一类,而不能同时包含一条狗和一只大象 **

    函数的两个步骤:


    1.\operatorname{softmax}(x){i}=y_i=\frac{\exp \left(x{i}\right)}{\sum_{j} \exp \left(x_{j}\right)}\
    2.H_{y^{\prime}}(y)=-\sum_{i} y_{i}^{\prime} \log \left(y_{i}\right)

    1. tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None,labels=None,logits=None,name=None)

      _sentinel:本质上是不用的参数,不用填

      labels:shape为[batch_size],labels[i]是[0,num_classes)的一个索引, type为int32或int64

      logits:shape为[batch_size,num_classes],type为float32或float64

      name:操作的名字,可填可不填

      适用的情况:每个类别相互独立且排斥的情况,一幅图只能属于一类,而不能同时包含一条狗和一只大象

    keras中带有的损失函数:

    1. keras..binary_crossentropy()
    2. keras..categorical_crossentropy()

    回归问题

    回归问题就是真实的预测出某个值,所以我们大多采用均方误差(MSE)来作为损失函数

    均方误差L=\frac{1}{N} \sum_{i=1}^N(y'-y)^2

    <u>为什么要用平方不用绝对值?</u>

    因为绝对值不连续也不能处处可导。

    模型的优化器

    就是神经网络中的梯度下降优化器及其变体。

    模型防止过拟合

    在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象。在训练神经网络的时候经常会遇到过拟合的问题,过拟合具体表现在:模型在训练数据上损失函数较小,预测准确率较高;但是在测试数据上损失函数比较大,预测准确率较低。

    dropout

    Dropout可以作为训练深度神经网络的一种trick供选择。在每个训练批次中,通过忽略一半的特征检测器(让一半的隐层节点值为0),可以明显地减少过拟合现象。这种方式可以减少特征检测器(隐层节点)间的相互作用,检测器相互作用是指某些检测器依赖其他检测器才能发挥作用。

    我们可以看下面的图:

    这样子就可以避免特定的神经元出现,强迫模型去学习更加鲁棒的参数。

    L1正则化

    模型性能度量

    精度与错误率

    一般模型都可以用这个评判标准就够用了。精度就是准确率。通常我们也把错误率叫做0-1损失期望,在0-1损失期望中,我们将分类错误的数据记为1,分类准确的数据反而为0。

    精度:正确分类的数据与全部分类数据的比值

    错误率:错误分类的数据与全部数据的比值

    查全率与查准率(召回率与精确率)

    在某些特定的任务中,我们还需要用到这个。比如在信息检索中,我们想知道“检索的信息有多少是用户感兴趣的
    ,以及“用户感兴趣的信息有多少被检测出来了”。

    我们以二分类为例:

    下面是混淆矩阵,当中会有预测表现和实际表现:

    实际表现 实际表现
    1 0
    预测表现 1 TP FP
    预测表现 0 FN TN

    查准率、精确率(P)=TP/(TP+FP):预测为“1”的情况中,预测正确的比例。

    查全率、召回率(R)=TP/(TP+FN):真实为“1”的情况中,预测正确的比例。

    FI=(a^2+1)P*R/a^2(P+R):为精确率和召回率的调和均值,相当于这两个的综合评价指标

    一般情况下查全率,查准率是“鱼与熊掌”,不可兼得。在不同的情况下,选取的衡量指标不一样!

    ROC

    ROC曲线和AUC值常常作为一个模型拟合程度的衡量指标,ROC英文名是receiver operating characteristic curve ,中文名是 接受者操作特性曲线(感受性曲线)。曲线上面的各点反映着对同一信号的刺激反应。

    TPR(True positive rate 真阳率,敏感性)=R(召回率)=TP/(TP+FN)

    FPR(False positive rate,假阳率,1-特异性)=FP/(FP+TN):真实为“0”的情况下,预测为正确的比例。

    理想情况下,TPR应该为1,FPR为0。曲线上的每一个点对应一个阈值,越接近原点,阈值越大。

    ROC曲线以FPR为x轴,TPR为y轴得到曲线。

    AUC的值为ROC曲线下面的面积。如果模型预测的准确,ROC曲线经过(0,1)点,且AUC的值为1。在实际中,一般的AUC在0.5~1之间,当然是AUC的值越大,模型的拟合效果更好

    KS值=max(TPR-FPR)=max,KS值可以反映这个模型的最优区间

    模型的评估指标

    模型的衡量指标是很重要的部分,因为这样才能用来比较两个模型哪一个表现更好。但是我们要知道,衡量模型并不是只有准确率这一个指标,接下来我们就来介绍衡量模型的各个指标。以后见到的话,欢迎大家继续补充进来。

    • 参数量

    是指模型中含有多少个参数,直接决定模型文件的大小,也影响模型推断时对内存的占用量。

    • 计算量

    是指模型推断时需要多少计算次数,通常是以MAC(Multiply Accumulate )乘积累加次数来表示的。

    对于__全连接层__:

    这里我们描述一个问题,如果我们有三输入,三输出,有偏置的全连接层。

    img

    那么这样的话我们可以得到:

    a_1^{(2)}=x_0+w_{11}x_1+w_{12}x_2+w_{13}x_3\
    a_2^{(2)}=x_0+w_{21}x_1+w_{22}x_2+w_{23}x_3\
    a_3^{(2)}=x_0+w_{32}x_1+w_{32}x_2+w_{33}x_3

    从这里我们就可以看到参数w的数量是3*3+1=10,MAC的数量是3*3=9。那么我们推广到n输入,m输出,有偏置的全连接层,其参数的数量为m*n,乘积累加次数为m*n。

    对于__卷积__:

    对于一个单通道输入,核的大小为km<em>knk_m<em>k_n,输出图片的大小为mo</em>no m_o</em>n_o(输出图片的大小就是最后feature map的大小),有偏置,步长为1,没有补0。

    在这里插入图片描述

    那么这样的话我们可以得到:

    O_{11}=w_{11}I_{11}+w_{12}I_{12}+w_{13}I_{13}+\
    w_{21}I_{21}+w_{22}I_{22}+w_{23}I_{23}+\
    w_{31}I_{31}+w_{32}I_{32}+w_{33}I_{33}+b

    最后我们可以知道参数的数量数kn<em>kn+1k_n<em>k_n+1,乘积累加次数为mo</em>no<em>km</em>knm_o</em>n_o<em>k_m</em>k_n

    如果推广到cic_i通道输入,coc_o通道输出的话,那么其参数的数量就是(km<em>kn)<em>ci</em>co+co(k_m<em>k_n)<em>c_i</em>c_o+c_o ( 这个地方需要好好的想一想,为什么是这个,还有这个加1的意思是每一层都有一个b?),MAC的次数是mo</em>no<em>km</em>kn<em>ci</em>com_o</em>n_o<em>k_m</em>k_n<em>c_i</em>c_o(当然这个地方你也要清楚是为什么)。

    当然这个要是是__深度可分离卷积__,那么又是什么呢?

    在这里插入图片描述上面

    上面的参数量km<em>kn</em>ci+1<em>1</em>co<em>cik_m<em>k_n</em>c_i+1<em>1</em>c_o<em>c_i,MAC的数量就是mo</em>no<em>ci</em>km<em>kn+1</em>1<em>mo</em>no<em>ci</em>com_o</em>n_o<em>c_i</em>k_m<em>k_n+1</em>1<em>m_o</em>n_o<em>c_i</em>c_o,这个地方简化了偏置。

    • 输入矩阵格式:四个维度,依次为:样本数、图像高度、图像宽度、图像通道数
    • 输出矩阵格式:与输出矩阵的维度顺序和含义相同,但是后三个维度(图像高度、图像宽度、图像通道数)的尺寸发生变化。
    • 权重矩阵(卷积核)格式:同样是四个维度,但维度的含义与上面两者都不同,为:卷积核高度、卷积核宽度、输入通道数、输出通道数(卷积核个数)

    对于__池化__:

    输入输出的通道数都为c,池化和卷积的操作很相近,最大池化仅仅是比较操作,所以其计算量通常忽略不计,而且最大池化没有参数。对于平均池化也是没有参数量,但是运算有mo<em>no</em>(km<em>kn1)<em>cm_o<em>n_o</em>(k_m<em>k_n-1)<em>c次加法,和mo</em>no</em>cm_o</em>n_o</em>c次除法。

    对于__批量归一化__:

    输入数量为N,下面为归一化的公式,其中γ,β\gamma,\beta是缩放和平移的参数。mean为平均数,variance是方差的平均,这两者都是已知的。

    BN[j]=\frac{\gamma(conv[j]-mean)}{\sqrt{variance}}+\beta

    可以很容易看到,其参数数量为 2N,运算包含 2N 次加法(包括减法)和 N次乘法。

    • flops(floating point operations per second)

    中文意思是每秒浮点运算的次数,用来衡量硬件的计算能力。比如nvida官网的各种显卡的计算能力就是用这个来比较的(nvida的量级表示的是MM,2^12)。我们可以知道所谓的浮点数运算就是关于W的相关乘法,以及b的加法,所以好像flops的个数与参数的数量是一样的。所以对于卷积层来说,flops的数量就是:参数的数目*feature map的大小。上面的__卷积__的flops的大小就是(knkmcico+co)(mono)(k_n \ast k_m \ast c_i \ast c_o + c_o) \ast (m_o \ast n_o) 。对于__全连接__,因为不存在权值共享,所以flops的数目就是参数的数目:mn+1 m \ast n + 1(m是输入的神经元个数,n是输出的神经元个数)。当然我觉得这地方的算法和偏置b,题目怎么安排有关。

    • 模型运行时间

    flops数量是k,一个乘法要m个cycle,CPU主频是f,那么模型的理论运行时间是k*m/f。

    模型的学习

    这个地方主要是针对深度学习和强化学习。对于传统的机器学习算法,以后有时间我会继续看西瓜书和传统的机器学习,这都需要了解的。下面的模型基本都是机器学习中神经网络的部分。要知道一个模型的提出,就是对一个方法的提出。

    感知机

    第一个具有学习能力的神经网络,只有一个加法器和一个处理单元(激活函数),只有输出层这一层,输入层被看成第0层。

    多层感知机(MLP)

    在感知机的基础上进化了,有一个或多个隐藏层,在该 MLP 中,下层的所有神经元都连接到其相邻的上层的所有神经元。因此,MLP 也被称为全连接层

    CNN由纽约大学的Yann Lecun于1998年提出,其本质是一个多层感知机,成功的原因在于其所采用的局部连接和权值共享的方式:一方面减少了权值的数量使得网络易于优化;另一方面降低了模型的复杂度,也就是减小了过拟合的风险

    <img src="神经网络讲解.assets/20180712111315378.png" alt="这里写图片描述" />

    LeNet-5

    这个模型被用于MNIST数据集,取得了非常好的准确率。

    这个模型只有7层,这已经非常少的层了。输入的是黑白图像,不用考虑通道数,只用考虑个数。

    c1:32*32 --> 28*28*6

    s2:(下采样)28*28*6 --> 14*14*6

    c3:14*14*6 --> 10*10*16

    s4: 10*10*16 --> 5*5*16

    c5:5*5*16 --> 1*1*120(之所以仍将C5标识为卷积层而非全连接层是因为如果LeNet-5的输入变大,而其他的保持不变,那么此时特征图的维数就会比1x1大。)

    F6:1*1*120 --> 84*1(???好奇是怎么得到的)

    output: 84*1 --> 10*1

    模型的贡献:

    可能就是成功运用了CNN,为后面的发展打下了基础吧。

    AlexNet

    这个网络赢得了2012 ILSVRC(2012年ImageNet 大规模视觉识别挑战赛)。CNN一战成名。

    这里要知道一个公式: output_size =1+ (input_size+2*padding-kernel_size)/stride

    (2*padding是因为两边都要填充,当然下面的计算没有*2)

    因为是采用双CPU服务器分开训练,所以看到了上下两个流程图。

    模型的突出贡献:

    • 提出了__RELU__这个激活函数。f(x)=max(0,x)

      RELU的优势:

      • ReLU本质上是分段线性模型,前向计算非常简单,无需指数之类操作;
      • ReLU的偏导也很简单,反向传播梯度,无需指数或者除法之类操作;
      • ReLU不容易发生梯度发散问题,Tanh和Logistic激活函数在两端的时候导数容易趋近于零,多级连乘后梯度更加约等于0;
      • ReLU关闭了右边,从而会使得很多的隐层输出为0,即网络变得稀疏,起到了类似L1的正则化作用,可以在一定程度上缓解过拟合。

      缺点:

      • 当然,ReLU也是有缺点的,比如左边全部关了很容易导致某些隐藏节点永无翻身之日,所以后来又出现pReLU、random ReLU等改进,而且ReLU会很容易改变数据的分布,因此ReLU后加Batch Normalization也是常用的改进的方法。
    • 提出了__dropout__这个来防止过拟合。Dropout在训练过程中将输入层和中间层的一些神经元随机置零,使得训练过程收敛的更慢,但得到的网络模型更加具有鲁棒性。

    • 模型还对输入的数据进行了__数据扩充__,如:图像的平移,水平翻转,调整图像的灰度,同时输入数据的取法也很不同。输入数据也进行了__归一化__,为了使训练数据和测试数据的数据的分布相同,提高泛化能力;同时使每批次的数据分布相同,提高训练速度。(这个看论文了解)

    • 提出了__LRN层(Local Response Normalization)__。LRN是对局部神经元的活动创建竞争机制,使得其中响应较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。一般放在最大池化后面。

    • 使用了__max padding__,避免了平均池化所带来的模糊化的效果,之前CNN都使用的是平均池化。

    • .....还有很多论文中的一些细节处理方法。

    两台GPU服务器,训练了5-6天。下面还有精简化的网络说明:

    AlexNet的每层的超参数,参数量和计算量:

    <img src="神经网络讲解.assets/2018042015212820" alt="这里写图片描述" style="zoom:50%;" />

    上面的图好大,但是可以看到全连接层的参数量很多,但是计算量好像不是很多。可以从这个地方看到卷积层可以较小的参数量提取到有效的特征。

    为什么使用全连接层:

    • 全连接层在CNN中起到分类器的作用,前面的卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间,全连接层是将学到的特征映射映射到样本标记空间,就是矩阵乘法,再加上激活函数的非线性映射,多层全连接层理论上可以模拟任何非线性变换(??)。但缺点也很明显: 无法保持空间结构。
    • 由于全连接网络的冗余(占整个我拿过来参数的80%),近期一些好的网络模型使用全局平均池化(GAP)取代FC来融合学到的深度特征,最后使用softmax等损失函数作为网络目标函数来指导学习过程,用GAP替代FC的网络通常有较好的预测性能。
    • 全连接的一个作用是维度变换,尤其是可以把高维变到低维,同时把有用的信息保留下来。全连接另一个作用是隐含语义的表达(embedding),把原始特征映射到各个隐语义节点(hidden node)。对于最后一层全连接而言,就是分类的显示表达。不同channel同一位置上的全连接等价与1x1的卷积。N个节点的全连接可近似为N个模板卷积后的均值池化(GAP)。

    全局平均池化(GAP):

    假如最后一层的数据是10个6*6的特征图,global average pooling是将每个特征图计算所有像素点的均值,输出一个数据值,10个特征图就会输出10个值,组成一个1*10的特征向量。有个feature map GAP之后得到一个值,在进行全连接就会大大减少参数量。

    • 用特征图直接表示属于某类的置信率,比如有10个输出,就在最后输出10个特征图,每个特征图的值加起来求均值,然后将均值作为其属于某类的置信值,再输入softmax中,效果较好。

    • 因为FC的参数众多,这么做就减少了参数的数量(在最近比较火的模型压缩中,这个优势可以很好的压缩模型的大小)。

    • 因为减少了参数的数量,可以很好的减轻过拟合的发生。

    ZF Net

    2013年的ILSVRC比赛冠军。和Alex Net很类似,主要是对神经网络提出了很好的可视化。

    突出贡献:

    • 提出了一种__可视化__方法;
    • 发现学习到的特征远不是无法解释的,而是特征间存在层次性,层数越深,特征不变性越强,类别的判别能力越强;
    • 通过可视化模型中间层,在alexnet基础上进一步提升了分类效果;
    • 遮挡实验表明分类时模型和局部块的特征高度相关;
    • 模型的深度很关键;
    • 预训练模型可以在其他数据集上fine-tuning得到很好的结果。

    VGGNet

    VGGNet是牛津大学计算机视觉组(Visual?Geometry?Group)和Google DeepMind公司的研究员一起研发的的深度卷积神经网络。取得了ILSVRC 2014比赛分类项目的第2名和定位项目的第1名。很适合做迁移学习,提到了一系列,VGG-16、VGG-19,不同层,参数也不同,最后选择了D的参数,结果最好。装有4个NVIDIA Titan Black GPUs的电脑上,训练了2到3周。

    <img src="神经网络讲解.assets/20180420161410550.png" alt="这里写图片描述" style="zoom:80%;" />

    突出的贡献:

    • 提出了LRN层作用不大,还很耗时,所以__抛弃了LRN层__。
    • 提出了__网络越深效果越好__。
    • 卷积核使用更小的卷积,也可以减少参数,比如3*3。这里使用3x3的滤波器和AlexNet在第一层使用11x11的滤波器和ZF Net 7x7的滤波器作用完全不同。作者认为两个3x3的卷积层组合可以实现5x5的有效感受野。这就在保持滤波器尺寸较小的同时模拟了大型滤波器,减少了参数。此外,有两个卷积层就能够使用两层ReLU。
    • 同时也使用了很多的1*1卷积层,目的是增加了ReLU,增加了非线性。
    • 也与AlexNet一样进行了__数据的处理__,随机裁剪还有随机水平翻转和RGB色彩偏移。(看论文)

    VGG虽然比AlexNet模型层数多,参数量更多,但是因为更深的网络和更小的卷积核带来的隐式正则化和一些预训练(看论文)的结果,需要的收敛的迭代次数减小了许多。

    VGG-19网络的精简模型:

    GoogLeNet

    ImageNet 2014比赛分类任务的第1名,将错误率降低到了6.656%,突出的特点是大大增加了卷积神经网络的深度。将最后的全连接层都换成了1x1的卷积层,大大加速了训练速率。GoogLeNet是谷歌团队为了参加ILSVRC 2014比赛而精心准备的。

    模型的贡献:

    • 采用模块化的模型构建,方便添加和修改。
    • 最后用了全局平均池化来代替全连接,想法来自于NIN(??)。可以提高一定的准确率。
    • 为了避免梯度消失,网络额外增加了2个辅助的softmax用于前向传导梯度

    全局平均池化:

    Inception V1

    nception的名字来源非常有意思,作者说其灵感来自于《盗梦空间 (Inception) 》中的梗,“We need to go deeper.” 即在神经网络中,需要“go deeper”。

    一般来说,提升网络性能最直接的办法就是增加网络深度和宽度,这也就意味着巨量的参数。但是,巨量参数容易产生过拟合也会大大增加计算量。文章认为解决上述两个缺点的根本方法是将全连接甚至一般的卷积都转化为稀疏连接。

    2012年AlexNet做出历史突破以来,直到GoogLeNet出来之前,主流的网络结构突破大致是网络更深(层数),网络更宽(神经元数)。那么解决上述问题的方法当然就是增加网络深度和宽度的同时减少参数,Inception就是在这样的情况下应运而生。

    native inception:

    上图的说明:

    • 采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合
    • 之所以卷积核采用1x1,3x3和5x5,主要是为了方便对齐,设定卷积步长stride=1,只要分别设定padding=0,1,2,那么卷积之后便可以得到相同维度的特征,然后将这些特征就可以直接拼接在一起了。
    • 文章中说pooling被证明很有效,所以网络结构中也加入了
    • 网络越到后面,特征越抽象,而且每个特征所涉及的感受野也变大了,因此随着层数的增加,3x3和5x5的比例也要增加。

    这样做的目的:可以明显的减少参数。也可以减少计算量。

    <img src="神经网络讲解.assets/20180624142026194.jpg" alt="这里写图片描述" style="zoom:80%;" />

    但是上面的5*5的卷积核依然会带来大量的参数,特别是越往后,感受野越大,参数越多,采用NIN的思想,再进行改进,得到inception v1:

    上图的说明:

    • **使用1x1卷积进行降维,降低了计算复杂度。**当某个卷积层输入的特征数较多,对这个输入进行卷积运算将产生巨大的计算量;如果对输入先进行降维,减少特征数后再做卷积计算量就会显著减少。
    • 使用1x1卷积进行降维,减少了需要训练的参数个数。
    • **在相同尺寸的感受野中叠加更多的卷积,能提取到更丰富的特征。**卷积计算后面都紧跟着激活函数(比如relu),所以将两个卷积串联,就能组合出更多的非线性特征。

    参数量:

    <img src="神经网络讲解.assets/20180718174544311.png" alt="这里写图片描述" />

    GoogLeNet Incepetion V1比AlexNet的8层或者VGGNet的19层还要更深。但其计算量只有15亿次浮点运算,同时只有500万的参数量,仅为AlexNet参数量(6000万)的1/12,却可以达到远胜于AlexNet的准确率,可以说是非常优秀并且非常实用的模型。本文的主要想法其实是想通过构建密集的块结构来近似最优的稀疏结构,从而达到提高性能而又不大量增加计算量的目的。GoogleNet的caffemodel大小约50M,但性能却很优异。

    inception v2

    v3与v2出自于同一个论文,V2和V1的最大的不同就是,V2增加了Batch Normalization。

    Inception V2学习了VGGNet,用两个3x3的卷积代替5x5的卷积,用以降低参数量并减轻过拟合,inception v2还提出了著名的__Batch Normalization__方法,该方法是一个很有效的正则化的方法,可以让大型卷积网络的训练速度加快很多倍,同时收敛后的分类准确率也可以得到大幅度的提高。

    BN在用于神经网络某层时,会对每一个mini-batch数据的内部进行标准化(normalization)处理,使输出规范化到N(0,1)的正态分布,减少了Internal Covariate Shift(内部神经元分布的改变)。因为BN某种意义上还起到了正则化的作用,所以可以减少或者取消Dropout,简化网络结构。

    一般在训练网络时会对数据进行预处理,包括去掉均值、白化操作等,目的是为了加快训练:

    去均值化

    去均值是一种常用的数据处理方式,它是将各个特征值减去其均值,几何上的展现是可以将数据的中心移到坐标原点,python代码为X=X-np.mean(X,axis=0),对于图像来说,就是对每个像素的值都要减去平均值。

    PCA

    由于计算需要,需要实现进行前面所说的均值0化。
    PCA要做的是将数据的主成分找出。流程如下:

    1. 计算协方差矩阵
    2. 求特征值和特征向量
    3. 坐标转换
    4. 选择主成分
    X -= np.mean(X, axis = 0) # zero-center the data (important)
    cov = np.dot(X.T, X) / X.shape[0] # get the data covariance matrix,公式含义可按照协方差矩阵的定义得到
    U,S,V = np.linalg.svd(cov)
    Xrot = np.dot(X, U) # decorrelate the data1
    Xrot_reduced = np.dot(X, U[:,:100]) # Xrot_reduced becomes [N x 100]
    

    白化

    常见的有PCA白化,就是对数据进行PCA操作之后,再进行方差归一化,这样数据基本满足0均值、单位方差、弱相关性。作者首先尝试了对每一层数据都是用白化操作,但分析认为这是不可取的,因为白化需要计算协方差矩阵、求逆等操作,计算量很大,此外,反向传播时,白化操作不一定可导,于是使用了Normalization的操作。

    # whiten the data:
    # divide by the eigenvalues (which are square roots of the singular values)
    Xwhite = Xrot / np.sqrt(S + 1e-5)
    #另外我们防止出现除以0的情况,在分母处多加了0.00001,如果增大它会使得噪声减小。
    

    白化之后,得到的是一个多元高斯分布。上面两种处理的结果如下:

    需要注意:

    • CNN不用进行PCA和白化,只需要进行零均值化就好。
    • 注意进行所有的预处理时训练集、验证集、测试集都要使用相同的处理方法,比如减去相同的均值。

    标准化Normalization:

    标准化是将矩阵X中的Dimensions都保持在相似的范围内,有两种实现方式:

    1. 先使得均值为0,然后除以标准差,X=X / np.std(X, axis=0)

    2. 因为数据不在同一范围,而且各个维度在同一范围内对算法比较重要时,可以将其最大最小值分别缩放为1和-1,对于图像处理而言,因为一般数据都在0~255之间,所以不用再进行这一步了。

    计算过程:

    1. 求数据均值
    2. 求数据方差
    3. 数据进行标准化
    4. 训练参数γ,β
    5. 输出y通过γβ的线性变换得到新的值

    数据归一化的方法很简单,就是让数据具有0均值和单位方差:

    但是作者又说如果简单的这么干,会降低层的表达能力。比如下图,在使用sigmoid激活函数的时候,如果把数据限制到0均值单位方差,那么相当于只使用了激活函数中近似线性的部分,这显然会降低模型表达能力。

    因此作者为BN增加了2个参数,用来保持模型的表达嫩故,最后的BN为:

    上述公式中用到了均值E和方差Var,需要注意的是理想情况下E和Var应该是针对整个数据集的,但显然这是不现实的。因此,作者做了简化,用一个Batch的均值和方差作为对整个数据集均值和方差的估计。

    BN的意义

    解决的问题是梯度消失和梯度爆炸的问题

    1. 梯度消失

      例如sigmoid:

      在深度网络中,如果网络的激活输出很大,那么其梯度就很小,学习速率就很慢,假设每层学习梯度都小于最大值0.25,网络有n层,因为链式求导的原因,第一层的梯度小于0.25的n次方,所以学习速率就慢,对于最后一层只需对自身求导1次,梯度就大,学习速率就快。
      影响:在一个很大的深度网络中,浅层基本不学习,权值变化小,后面几层一直在学习,结果就是后面几层基本可以表示整个网络,失去了深度的意义。

    2. 梯度爆炸

      根据链式求导法则:

      第一层偏移量的梯度 = 激活层斜率1 x 权值1 x 激活层斜率2 x …激活层斜率(n-1) x 权值(n-1) x 激活层斜率n(我不是很懂这个部分??)

      假如激活层斜率均为最大值0.25,所有层的权值为100,这样梯度就会指数增加。

    BN如何在CNN中使用

    例如:CNN中的5x5的图像通过valid卷积得到的3x3的特征图,特征图里边的值作为BN的输入,也就是这9个数值通过BN计算并保存γ,β通过γ,β使得输出与输入不变。(什么事输入与输出一样??)假设输入的batch_size=m,那就有m x 9个数值,计算这m x 9个数据的γ,β并保存,这就是正向传播的过程,反向传播就是根据求得的γ,β来计算梯度。(计算梯度??)

    重要说明:

    1. 网络训练中以batch_size为最小单位不断迭代,很显然新的batch_size进入网络,就会有新的γ,β,因此在BN层中,共有总图像数 / batch_sizeγ,β被保存下来。
    2. 图像卷积过程中,通常是使用多个卷积核,得到多张特征图,对于多个的卷积核需要保存多个γ,β

    BN应该放在激活层之前还是之后

    作者在文章中说应该把BN放在激活函数之前,这是因为Wx+b具有更加一致和非稀疏的分布。但是也有人做实验表明放在激活函数后面效果更好。这是实验链接,里面有很多有意思的对比实验:

    下图a说明,BN可以加速训练。图b和c则分别展示了训练过程中输入数据分布的变化情况。

    作者在实验过程中发现,sigmoid比relu效果好。

    inception v3

    GoogLeNet凭借其优秀的表现,得到了很多研究人员的学习和使用,因此Google团队又对其进行了进一步发掘改进,产生了升级版本的GoogLeNet。这一节介绍的版本记为v2-v3(出自于一篇论文)。

    2014年以来,构建更深网络的同时逐渐成为主流,但是模型的变大也使得计算效率越来越低,这里文章试图找到不同方法来扩大网络的同时又尽可能的发挥计算性能。

    GoogLeNet的表现很好,但是,如果想要通过简单地放大Inception结构来构建更大的网络,则会立即提高计算消耗。此外,在V1版本中,文章也没给出有关构建Inception结构注意事项的清晰描述。因此,在文章中作者首先给出了一些已经被证明有效的用于放大网络的通用准则和优化方法。这些准则和方法适用但不局限于Inception结构。

    下面是准则和方法:

    • 避免表达瓶颈,特别是在网络考前的地方

      信息流前向传播过程中显然不能经过高度压缩的层,即表达瓶颈。从input到output,feature map的宽和高基本都会逐渐变小,但是不能一下子就变得很小。比如你上来就来个kernel = 7, stride = 5 ,这样显然不合适。
      另外输出的维度channel,一般来说会逐渐增多(每层的num_output),否则网络会很难训练。(特征维度并不代表信息的多少,只是作为一种估计的手段)
      这种情况一般发生在pooling层,字面意思是,pooling后特征图变小了,但有用信息不能丢,不能因为网络的漏斗形结构而产生表达瓶颈,解决办法是作者提出了一种特征图缩小方法,更复杂的池化。

    • 高维特征更容易处理

      高维特征更加容易区分,会加快训练。

    • 可以在低维嵌入上进行空间汇聚而无需担心丢失很多的信息

      比如在进行3x3卷积之前,可以对输入先进行降维而不会产生严重的后果,假设信息可以被简单的压缩,那么训练就会加快。

    • 平衡网络的深度和宽度

      上述的这些并不能直接用来提高网络质量,而仅用来在大环境下作指导。

    利用大尺度的滤波器进行图像的卷积

    大尺寸的卷积核可以带来更大的感受野,但也意味着更多的参数,比如5x5卷积核参数是3x3卷积核的25/9=2.78倍。为此,作者提出可以用2个连续的3x3卷积层(stride=1)组成的小网络来代替单个的5x5卷积层,(保持感受野范围的同时又减少了参数量)如下图:(感觉这个和VGGNet好像)

    说明:

    • 实验证明该操作不会造成表达缺失
    • 3*3卷积之后在激活可以提高性能,相当于两次非线性激活。

    从上面来看,大卷积核完全可以由一系列的3x3卷积核来替代,那能不能分解的更小一点呢。文章考虑了 nx1 卷积核。

    于是,任意nxn的卷积都可以通过1xn卷积后接nx1卷积来替代。实际上,作者发现在网络的前期使用这种分解效果并不好,还有在中度大小的feature map上使用效果才会更好。(对于mxm大小的feature map,建议m在12到20之间)。

    <img src="神经网络讲解.assets/u=1855530731,60981367&fm=173&app=25&f=JPEG.jpg" alt="img" style="zoom:50%;" />

    1. 图4是GoogLeNet V1中使用的Inception结构;
    2. 图5是用3x3卷积序列来代替大卷积核,inception v2的结构;
    3. 图6是用nx1卷积来代替大卷积核,这里设定n=7来应对17x17大小的feature map。该结构被正式用在GoogLeNet V2中。即非对称个卷积核,其实类似于卷积运算中,二维分解为1维计算,提高了计算速度。下面的图所示。

    模型如下图所示:

    <img src="神经网络讲解.assets/u=3879877993,2814935355&fm=173&app=25&f=JPEG.jpg" alt="img" style="zoom:80%;" />

    figure5,figure6,figure7对应模型的三个进化。

    使用辅助分类器

    这个辅助分类器我觉得还是看看论文再说。

    改变降低特征图尺寸的方式

    就是为了符合设计准则的第一条,就是为了避免表达瓶颈。上面所说的pooling层,一般的为了避免信息丢失的方法就是在pooling层之前增加特征图的倍数,通过这个方式来保持网络的表达能力,但与此同时,计算量大大增加。所以有了下面的:

    上图就是作者的改进方式。有两个通道,一个是卷积层,一个是pooling层,两个通道生成的特征图大小一样,concat在一起即可。


    Inception[V1]: Going Deeper with Convolutions, 2014

    Inception[V2-V3]:Rethinking the Inception Architecture for Computer Vision, 2015
    Inception[V4-ResNet]: Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning, 2016


    ResNet

    ResNet在2015年被提出,在ImageNet比赛classification任务上获得第一名,因为它“简单与实用”并存,之后很多方法都建立在ResNet50或者ResNet101的基础上完成的,检测,分割,识别等领域都纷纷使用ResNet,Alpha zero也使用了ResNet,所以可见ResNet确实很好用。

    下面是一张图:

    <img src="神经网络讲解.assets/20180718183806737" alt="这里写图片描述" style="zoom:50%;" />

    从上面两个图可以看出,在网络很深的时候(56层相比20层),模型效果却越来越差了(误差率越高),并不是网络越深越好。通过实验可以发现:随着网络层级的不断增加,模型精度不断得到提升,而当网络层级增加到一定的数目以后,训练精度和测试精度迅速下降,这说明当网络变得很深以后,深度网络就变得更加难以训练了。

    ResNet的提出

    最开始是想到了恒等映射层(indentity mapping,y=x)。而这里提到的使用恒等映射直接将前一层输出传到后面的思想,便是著名深度残差网络ResNet的灵感来源。

    ResNet引入了残差网络结构(residual network),通过这种残差网络结构,可以把网络层弄的很深(据说目前可以达到1000多层),并且最终的分类效果也非常好,残差网络的基本结构如下图所示,很明显,该图是带有跳跃结构的:

    残差网络借鉴了高速网络的跨层连接的思想,但是对其进行了改进,残差项原本是带权值的,但ResNet用恒等映射代替了它。

    上图的残差网络中,通过捷径连接的方式直接将输入x传到输出作为初始结果,输出结果为H(x)=F(x)+x,当F(x)=0时,H(x)=x,也就是恒等映射。于是,ResNet相当于将学习目标改变了,不再是学习一个完整的输出,而是目标值H(X)和x的差值,也就是所谓的残差F(x) := H(x)-x,因此,后面的训练目标就是要将残差结果逼近于0,使到随着网络加深,准确率不下降。

    ResNet的目的

    深层CNN训练的困难在于梯度衰减(或者爆炸),即使有BN,十几层的CNN也非常的难训练。随着网络的加深,出现了训练集准确率下降的现象,但是我们又可以确定这不是由过拟合造成的,因为过拟合的情况下,训练集应该准确率很高,所以作者针对这个问题提出了一种全新的网络,称为深度残差网络。

    如果离输入层太远,残差传回来的信号很弱,如果每一层学习一个独立的f(x)很困难,那么直接打通一个快速的通道,把input直接送到后面车层次就很简单。每次只要相对于原数据,学习出来一个残差即可,而不是直接映射f(x)。

    好处:只有一条通路的反向传播,会做连乘导致梯度消失,但现在有两条路,会变成求和的形式,避免梯度消失。后面的层可以看见输入,不至于因为信息损失而失去学习能力。
    如果连乘的方式会造成梯度消失的话,那么连加。传统的网络每次学习会学习x->f(x)的完整映射,那么ResNet只学习残差的映射

    残差指什么

    ResNet提出了两种mapping:

    • identity mapping,指的“本身的线”,也就是公式中的x,就是图中弯曲的曲线;

    • residual mapping,指的是“差”,也就是y−x,所以残差指的是F(x)部分,也就是除过identity mapping之外的其余的线;

    所以最后的输出为,y=F(x)+x。

    为什么残差网络可以随着网络的加深,准确率不下降呢?

    理论上,对于“随着网络加深,准确率下降”的问题,Resnet提供了两种选择方式,也就是identity mapping和residual mapping,如果网络已经到达最优,继续加深网络,residual mapping将被push为0,只剩下identity mapping,这样理论上网络一直处于最优状态了,网络的性能也就不会随着深度增加而降低了。

    ResNet的结构

    传统的神经网络都是以层叠卷积层的方式提高网络深度,从而提高识别精度,但层叠过多的卷积层会出现一个问题,就是梯度消失,使得反向传播的过程中无法有效的将梯度更新到前面的网络层,导致前面的层的参数无法更新。
    而BN和ResNet的skip connection就是为了解决这个问题,BN通过规范化输入数据,改变数据的分布,在前向传播的过程中,防止梯度消失的问题,而skip connection则能在后传过程中更好地把梯度传到更浅的层次中。

    为什么ResNet可以把梯度传到更浅层的层次

    当权重很小的时候,前向传播之后到输出层的参数值会非常小,反向传播时依然要和小的权重值相乘,参数值只会越来越小,数量级下降的非常快。
    这就是梯度弥散。假如模型的层数越深,这种梯度弥散的情况就更加严重,导致浅层部分的网络权重参数得不到很好的训练,这就是为什么在Resnet出现之前,CNN网络都不超过20多层的原因。

    上面的绿色是参数x的输出,下面的红色是反向传播的梯度数值。黄色的虚线就是skip connection。这个图的反向传播我有点不清楚???

    ResNet的网络结构

    <img src="神经网络讲解.assets/20180718190519650.png" alt="这里写图片描述" style="zoom:67%;" />

    这个网络的突出贡献:

    • 当然就是提出了shortcut/skip connnection。
    • zero_padding:对恒等层进行0填充的方式将维度补充完整。这种方法不会增加额外的参数。
    • projection:在恒等层采用1x1的卷积核来增加维度。这种方法会增加额外的参数

    当然文章中给出了两种方式:

    左边的是ResNet34,右边的是ResNet50/101/152中的结构。其中右图就是为了降低参数的数目。用1*1的卷积来降维升维。所以右边的结构通常又称为“bottleneck design”。

    下面我们提出几个关于ResNet的问题:

    1. 图1中的F(x)和x的channel个数不同怎么办,因为F(x)和x是按照channel维度相加的,channel不同怎么相加呢?

      针对channel的个数是否相同,我们有两种情况,我们可以看到上面的ResNet的网络中有实线和虚线两种方式。

      实线:实线的部分都是一样的特征图,所以channel的个数一致,采用的计算方式y=f(x)+x y=f(x)+x.

      虚线:后面有 /2 的字样,这个意思是步长为2,应该是为了解决分辨率扩大一倍的问题。channel的个数不一样,所以计算方式就是y=f(x)+wxy=f(x)+wx.其中w就是卷积操作,用来调整channel维度的。

    ResNet50和ResNet101

    这里提出两个出镜率特别高的结构,下面给出结构:

    注意:网络层数的计算有些并没有把激活层和pooling层算进去。

    当然后期的ResNet还有该井,下面是改进与之前的对比:

    inception v4

    前面我们介绍了ResNet与Inception,这个v4就是把两者都结合起来。inception v4,inception resnetv1,inception resnet v2都在一篇论文里面。Inception结构有着良好的性能,且计算量低。Residual connection不同于传统网络结构,且在2015 ILSVRC取得冠军,它的性能和Inception-v3接近。作者尝试将Inception结构和Residual connection结合,同时也设计了不用Residual connection版本的Inception-v4。通过对三个残差和一个Inception-v4进行组合,在top-5错误率上达到了 3.08%。

    inception v4模型:

    <img src="神经网络讲解.assets/20180613074140358.png" alt="img" style="zoom: 25%;" />

    stem模块:

    <img src="神经网络讲解.assets/2018061307432871.png" alt="这里写图片描述" style="zoom:60%;" />

    我们可以看到里面还有inception -A,inception-B,inception-C:

    inception-A:

    <img src="神经网络讲解.assets/2018061307444482.png" alt="img" style="zoom: 50%;" />

    inception-B:

    <img src="神经网络讲解.assets/20180613074554202.png" alt="这里写图片描述" style="zoom: 80%;" />

    inception-C:

    不同的inception模块的连接减少了feature map,却增加了filter bank。

    当然当中还有reduction-A,reduction-B,reduction-C,这些都是缩减块,用来改变网格的宽度和高度。

    35*35变17*17reduction-A:

    <img src="神经网络讲解.assets/20180613074759876.png" alt="img" style="zoom:60%;" />

    17*17变8*8reduction-B:

    <img src="神经网络讲解.assets/20180613074901632.png" alt="img" style="zoom:60%;" />

    inception-ResNet

    我们尝试了残差Inception的几个版本。这里对其中的两个进行具体细节展示。第一个是“Inception-ResNet-v1”,计算代价跟Inception-v3大致相同,第二个“Inception-ResNet-v2”的计算代价跟Inception-v4网络基本相同。它们有着不同的stem。 两个子版本都有相同的模块 A、B、C 和缩减块结构。唯一的不同在于超参数设置。
    Inception-ResNet的两个版本,结构基本相同,只是细节不同。inception-resnet v1的A,B,C结构为:

    不知道能不能看清,但是好像可以。 左起)Inception ResNet 中的 Inception 模块 A、B、C。注意池化层被残差连接所替代,并在残差加运算之前有额外的 1x1 卷积。

    inception-resnet-v1的reductionA,B的结构为:

    可以看到reduction-A与inceptionv4中的reduction-A相同。

    如果卷积核的数量超过 1000,则网络架构更深层的残差单元将导致网络崩溃。因此,为了增加稳定性,作者通过 0.1 到 0.3 的比例缩放残差激活值 。

    <img src="神经网络讲解.assets/u=2189937620,1487758036&fm=173&app=25&f=JPEG.jpg" alt="img" style="zoom:80%;" />

    当然inception-resnetv1,v2的整体结构为:

    我们能得到什么结论呢?

    本文详细呈现了三种新的网络结构:

    (1)Inception-ResNet-v1:混合Inception版本,它的计算效率同Inception-v3;

    (2)Inception-ResNet-v2:更加昂贵的混合Inception版本,同明显改善了识别性能;

    (3)Inception-v4:没有残差链接的纯净Inception变种,性能如同Inception-ResNet-v2我们研究了引入残差连接如何显著的提高inception网络的训练速度。而且仅仅凭借增加的模型尺寸,我们的最新的模型(带和不带残差连接)都优于我们以前的网络。

    对于所有inception模型的总结

    inception是通过增加网络的宽度来提高网络性能,在每个inception模块中,使用了不同大小的卷积核,可以理解成不同的感受野,然后将其concentrate起来,丰富了每层的信息。之后,使用了BN算法(BN使用在conv之后,relu之前),来加速网络的收敛速度。在V3版本中,还使用了卷积因子分解的思想,将大卷积核分解成小卷积,节省了参数,降低了模型大小。在V4版本中,使用了更加统一的inception模块,并结合了resnet的残差思想,能将网络做得更深。

    mobilenet

    xception

    这个也是一个模型,是把depth wise separable convolution结合了起来。

    特殊卷积的介绍

    Dilation 卷积

    这个某个自然语言处理中的一个卷积用法,这里我们就不介绍这个论文,而只是介绍这个卷积。这个又叫做膨胀卷积或空洞卷积,下面是一个动图,卷积只有部分有值,其余部分为0.

    膨胀卷积的好处是不做pooling损失信息的情况下,加大了感受野,让每个卷积的输出都包含较大范围的信息。 在图像需要全局信息或者自然语言处理中需要较长的sequence信息依赖的问题中,都能很好的应用。

    [**感受野(Receptive Field)**的定义是卷积神经网络每一层输出的特征图(feature map)上的像素点在输入图片上映射的区域大小。回顾一下感受野的概念! ]

    在代码中:

    tf.nn.atrous_conv2d(value,filters,rate=1,padding,name=None)
    

    value,filters应该都知道是什么,那rate呢? 正常的卷积通常会有stride,即卷积核滑动的步长,而膨胀卷积通过定义卷积和当中穿插的rate-1个0的个数,实现对原始数据采样间隔变大。 rate就是膨胀率,膨胀后卷积核的大小就是:rate*(kernel_size-1)+1。

    模型中有这个膨胀卷积存在的CNN模型叫做:IDCNN(iterated dilated CNN)

    参与比赛的心得

    数据模型预测

    在这类比赛中主要就是pandas的数据处理,可以说80%的时候都是数据的处理,模型的话反而很多,有时候最简单的机器学习算法,比如决策树等等都可以做到很好的分类,所以主要是数据的处理!!要知道方法千千万万,有时候不一定下面的方法全部都要是用。

    如何正确筛选数据(特征工程)

    • 不同的题目有不同的筛选方法,所以这里没有一个定式。拿到题目后,首先要分析题目,判断哪些数据是对预测毫无关联的,首先去除,还有时间数据的处理就不说了。

    • 关于数据中NAN的处理,倒是是设置为0,还是平均值,还是无穷小,无穷大,也是要根据题目和其他数据来确定的,要是这个数据中间有很多的0,那NaN肯定不能设置为0,有设置为-999的。

    • 判断哪些数据与结果的相关性很小,这些就可以剔除。关于相关性df有corr()的用法,使用corr的时候最好学会使用sns.heatmap(查看tensorflow的讲解),这样的图形界面更加的直观!当我们在用 逻辑回归、决策树等模型方法构建分类模型时 ,需要做更细致的筛选,这个时候要知道woe(weight of evidenc 证据权重)和iv(information value 信息价值)有关。

      W O E_{i}=\ln \left(\frac{p y_{i}}{p n_{i}}\right)=\ln \left(\frac{# y_{i} / # y_{T}}{# n_{i} / # n_{T}}\right)

      I V_{i}=\left(p y_{i}-p n_{i}\right)^{} W O E_{i}=\left(p y_{i}-p n_{i}\right)^{} \ln \left(\frac{py_{i}}{pn_{i}}\right)=\left(# y_{i} / # y_{T}-# n_{i} / # n_{T}\right)^{*} \ln \left(\frac{# y_{i} / # y_{T}}{# n_{i} / # n_{T}}\right)

      IV=\sum_{i}^{n} IV_i

      这个地方可能需要用到pd.pivot_table 去建立透明表格。

      具体的讲解见: https://blog.csdn.net/xiezhen_zheng/article/details/82888653

    • 除了上面之外,每一个信息有很多的数据,我们需要对当中的重复项进行删除,可以使用df.drop_duplicates,或是直接建立函数对当中的疑似错误数据进行删除。有些可能设置数据的范围,但是一般人是不会知道数据的范围为什么才是有效的,所以一般不考虑阈值。

    上面这些步骤完成之后,数据基本上就是一个漂亮的,没有重复的,与最后的结果几乎都相关的数据。这样的数据最后得到的准确率才会高!!

    数据处理的细节

    • 关于object类型的数据,有时候数组也是object类型,这个时候应该计算“,”的个数再+1。
    • 一个信息中的NaN过多,也是可以去除的。
    • 对于离散数据的处理方法,一般是object数据之类的,用Labelencoding 或是 one-hot encoding来处理,可以减少内存,使数据处理更加方便。

    模型好坏的评价



  • 还没写完,因为是md直接复制上去,所以有些显示不出来


 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

与 Dian 的连接断开,我们正在尝试重连,请耐心等待