数据集分为 训练数据集(分为训练集和验证集合(用于参数调优)),测试集合(评价最终模型用)
在交叉验证的时候:将训练数据集分成5份,1份用来验证调优(循环4次),取平均值
tips:当超参数多,需要的验证集合数量会很大,所以用交叉验证较好
K邻近:数据维度低效果还可以,测试时间很长,需要存储所有训练数据,耗费资源。神经网络和这个相反。其次,K临近不是基于图像语义的,有点类似于分类基于他的背景。
线性分类(用直线,平面,超曲面将类别分明开,而不是用曲线,曲面分开):
eg:神经网络和卷积
神经网络:包括①评分函数,和②损失函数两个重要部分:他只能看作只有一层的卷积神经网络,其中每个行向量表示每一类的分类器(类型通过行向量来体现)。这个过程中只需要实现一次矩阵乘法和矩阵加法。
- ①是将每个图片的像素映射到类别 。
(评分函数的定义) (xi表示吧一张图片挤成一个列向量(eg:3072*1))神经网络具体过程:1.图像压缩为列向量2.权值行向量表示某一类的分类器,列向量表示对应的图像尺度(D)3 经过矩阵相乘后加上一个表示类别偏置的列向量

左边每个行向量分类器的作用:像是一个分割工具。将计算得到的结果大于0和小于0区分开。
神经网络像是做模板运算
损失函数:代价函数(表示对结果的满意程度):
![[公式]](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/3/8/170b8a5d58cd765e~tplv-t2oaga2asx-jj-mark:3024:0:0:0:q75.png)
sj表示根据这个评分函数,分到的不正确类的评分值,sys是正确的分类
需要尽量损失值尽可能小,也是是正确分类的值大于错误分类的值duiyixie
损失函数类型:
1. SVM——(hinge loss)。平方折叶损失SVM(即L2-SVM),它使用的是![[公式]](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/3/8/170b8b47c9d3af38~tplv-t2oaga2asx-jj-mark:3024:0:0:0:q75.png)
2. Softmax分类器—— 评分函数不变,使用的交叉熵损失。将值作为未归一化的概率,
, log里面的东西就是softmax函数,输入是评分值,输出是一个向量,值在0-1之间。比较具有比较性,softmax对评分函数的解释:每个分类没有归一化之后的对数概率。对于结果更加具有解释性,对分类正确的一种正确性,不是一种真的实际意义的概率
正则化的作用:对一些大数值进行抑制,提高其泛化能力,避免了某一个w权重对整体造成较大影响这样,可以把很多特征都用上,避免过拟合。与Xi无关,只与权重有关。
![[公式]](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/3/8/170b8b420b2086e9~tplv-t2oaga2asx-jj-mark:3024:0:0:0:q75.png)
完整的损失函数:![[公式]](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/3/8/170b8b54c3a6612a~tplv-t2oaga2asx-jj-mark:3024:0:0:0:q75.png)
SVM和Softmax的比较:SVM比较局部目标化,超过边界值他就不管了。
得到了损失函数,如何优化呢? 引出下节。。。
最优化
最优化Optimization。最优化是寻找能使得损失函数值最小化的参数
的过程
SVM的损失是多个部分的组合,是一个凸函数(需要用凸优化去最小化),这里凸优化没学过,如果延展到神经网络则不是一个凸函数了,是一个凹凸不平的复杂地形
优化方案:
1. 垃圾方法,随即搜索
2.随机本地搜索,值下降的话就往该方向走走
3.跟随梯度,从数学上计算出最陡峭的方向——梯度,在对于属于图像来说,梯度是各个维度偏导数的向量。
梯度计算
- 1.数值梯度(简单)——就是那个导数的定义式:过程在每个维度上产生一个微小的变 化 量h,然后通过观察函数的变化,计算在该维度的偏导数,变量存储在grad中
比如,在计算损失函数的斜率时,通过以下计算出梯度,
W_new = W - step_size * df # 权重空间中的新位置 (往梯度的反方向更新)
注意,这里的步长,在未来可以成为学习率,是一个非常重要的超参数
数值梯度的缺点: 假如有30730各维度(32*32维度*10类),每走一步需要计算30731此梯度,太浪费计算资源了
- 2 .分析梯度(迅速,精确,但是复杂,可能容易出错,所以需要梯度检查)
note:百万级的数据集,如果全部计算为了更新权重参数,不是很划算。利用(Mini-Batch进行 (250个样本每批)进行更新),这样可以得到一个整个数据集梯度的近似(因为同一类的不同照片中。梯度也是基本相同的)。优点:快速收敛,如果每个批次中的数据量只有1,被称为随机梯度下降(SGD)
反向传播:
基本上就是计算权重W的梯度,很少会用输入数据Xi的梯度,有的时候在可视化的时候会用到Xi的梯度吧。
梯度是一个向量,装有各个变量的偏导数。
前向传播:就像计算神经网络的评分函数一样
链式法则计算复杂表达:
![[公式]](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/3/8/170b9767e9f1a09e~tplv-t2oaga2asx-jj-mark:3024:0:0:0:q75.png)
梯度[dfdx, dfdy, dfdz],它们告诉我们函数f对于变量[x, y, z]的敏感程度。这些局部梯度也会被存储下来。
反向传播:得到更新的梯度,前一个式子的偏导数*本身自己的偏导数(如果式子中有包括上一步的X的值,而不是常数,则将前一个式子的结果放带入,就得到更新的梯度值)
在评分函数的时候:F=WX,X很大的话,W的偏导数会很大,所以说数据的处理很重要,这样只能降低学习率来补偿了。
神经网络笔记
神经网络算法和线性分类的区别。
1. 线性分类
, 另外一个,
。例子来说,图像输入(3072,3072)。W1它可以是一个[100x3072]的矩阵,其作用是将图像转化为一个100维的过渡向量。函数
是非线性的,它会作用到每个元素。这个非线性函数有多种选择(称之为激活函数),后续将会学到。但这个形式是一个最常用的选择,它就是简单地设置阈值,将所有小于0的值变成0。最终,矩阵
的尺寸是[10x100],因此将得到10个数字,这10个数字可以解释为是分类的评分。
注意:Max()非线性非常重要,要不然上式变成了线性的。
神经网络也可以有基层:表示的是有几级(层)神经元相链接
神经元连接之后,是否激活,不确定,得看是否达到了阈值。
神经元在终端加上一个损失函数,也能将神经元变成线性分类器,(可以是二分类SOftmax,二分类SVm)。
常用激活函数:
①Sigmoid: 表达式
,值域在0-1,特点如下:
1.sigmoid神经元有一个不好的特性,就是当神经元的激活在接近0或1处时会饱和:在这些区域,梯度几乎为0。初始权重设置很重要,如果权重很大,大多数神经元就会饱和,导致网络不学习
2.得到的数据不是0中心的
②Tanh

Tanh非线性函数图像如上图右边所示。它将实数值压缩到[-1,1]之间。和sigmoid神经元一样,它也存在饱和问题,但是和sigmoid神经元不同的是,它的输出是零中心的。因此,在实际操作中,tanh非线性函数比sigmoid非线性函数更受欢迎。注意tanh神经元是一个简单放大的sigmoid神经元,具体说来就是:
。
③ Relu( Rectified Linear Unit) 下图图左 (不是很懂他的梯度消失的原因)

![[公式]](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/3/8/170b9b5c7a984900~tplv-t2oaga2asx-jj-mark:3024:0:0:0:q75.png)
- 优点:相较于sigmoid和tanh函数,ReLU对于随机梯度下降的收敛有巨大的加速作用( Krizhevsky 等的论文指出有6倍之多)。据称这是由它的线性,非饱和的公式导致的。
- 优点:sigmoid和tanh神经元含有指数运算等耗费计算资源的操作,而ReLU可以简单地通过对一个矩阵进行阈值计算得到。
- 缺点:在训练的时候,ReLU单元比较脆弱并且可能“死掉”。举例来说,当一个很大的梯度流过ReLU的神经元的时候,可能会导致梯度更新到一种特别的状态,在这种状态下神经元将无法被其他任何数据点再次激活。如果这种情况发生,那么从此所以流过这个神经元的梯度将都变成0。也就是说,这个ReLU单元在训练中将不可逆转的死亡,因为这导致了数据多样化的丢失。例如,如果学习率设置得太高,可能会发现网络中40%的神经元都会死掉(在整个训练集中这些神经元都不会被激活)。通过合理设置学习率,这种情况的发生概率会降低。
④Leaky ReLU。Leaky ReLU是为解决“ReLU死亡”问题的尝试。ReLU中当x<0时,函数值为0。而Leaky ReLU则是给出一个很小的负数梯度值,比如0.01。所以其函数公式为
其中
是一个小的常量。有些研究者的论文指出这个激活函数表现很不错,但是其效果并不是很稳定。
⑤MaxOut
它的函数是:
。ReLU和Leaky ReLU都是这个公式的特殊情况(比如ReLU就是当
的时候)。这样Maxout神经元就拥有ReLU单元的所有优点(线性操作和不饱和),而没有它的缺点(死亡的ReLU单元)。然而和ReLU对比,它每个神经元的参数数量增加了一倍,这就导致整体参数的数量激增。
如何选择合适的激活函数:
Relu,设置较好的学习率,观察网络的神经元的存活情况,如果单元死亡问题困扰,尝试Leaky Relu 和 Maxout
神经网络结构:
1.多少层的话,没有包括输入层
2. 最后一层,没有包括激活函数
3. 确定网络尺寸,神经元每个数和参数
3层神经网络效果会比两层好,但是越往上堆叠效果就不是这样的了。CNN的化就不是这个结论了,有个解释是图形具有层次化信息,所以越深越好
层的数量和尺寸如何设置:
越多层,表示函数可以越复杂。可以分类更加复杂的事物,缺点是,可能会造成过拟合
不要减少网络神经元数目的主要原因在于小网络更难使用梯度下降等局部方法来进行训练:虽然小型网络的损失函数的局部极小值更少,也比较容易收敛到这些局部极小值,但是这些最小值一般都很差,损失值很高。相反,大网络拥有更多的局部极小值,但就实际损失值来看,这些局部极小值表现更好,损失更小。因为神经网络是非凸的,就很难从数学上研究这些特性。
防止过拟合的一些因素:
L2正则化,dropout(需要再了解)和输入噪音等,减小神经元数量。在实践中,使用这些方法来控制过拟合比减少网络神经元数目要好得多。
神经网络笔记(2)
数据预处理:
X -= np.mean(X, axis=0) 表示输出的是一个行向量,每一个单独的是该位置的值-该维度均值
归一化:将所有维度都归一化。具体流程是,先对数据整体进行0中心化(使其在0附近围绕,每个维度都减去平均值),第二部,对每个维度的值去除其标准差。 或者 对每个维度进行各自归一化,使其分布在1和-1之间。归一化的使用,只有确定输入特征有着不腰痛的数值范围才会有效
PCA和白化:(不是很清楚)
图像预处理对于训练集,验证集的常见错误:
进行预处理很重要的一点是:任何预处理策略(比如数据均值)都只能在训练集数据上进行计算,算法训练完毕后再应用到验证集或者测试集上。例如,如果先计算整个数据集图像的平均值然后每张图片都减去平均值,最后将整个数据集分成训练/验证/测试集,那么这个做法是错误的。应该怎么做呢?应该先分成训练/验证/测试集,只是从训练集中求图片平均值,然后各个集(训练/验证/测试集)中的图像再减去这个平均值。
权重初始化:
不清楚为什么不能全部初始化为0的原因?


里面的 W和b全部一样,a1=a2=a3,反过来,偏导是 a1 a2 a3
正确:小随机数初始化。因此,权重初始值要非常接近0又不能等于0。解决方法就是将权重初始化为很小的数值,以此来打破对称性。其思路是:如果神经元刚开始的时候是随机且不相等的,那么它们将计算出不同的更新,并将自身变成整个网络的不同部分。小随机数权重初始化的实现方法是:W = 0.01 * np.random.randn(D,H)。其中randn函数是基于零均值和标准差的一个高斯分布
并不是小数值一定会得到好的结果。例如,一个神经网络的层中的权重值很小,那么在反向传播的时候就会计算出非常小的梯度(因为梯度与权重值是成比例的)。这就会很大程度上减小反向传播中的“梯度信号”,在深度网络中,就会出现问题。
偏置(biases)的初始化。通常将偏置初始化为0,这是因为随机小数值权重矩阵已经打破了对称性。对于ReLU非线性激活函数,有研究人员喜欢使用如0.01这样的小数值常量作为所有偏置的初始值,这是因为他们认为这样做能让所有的ReLU单元一开始就激活,这样就能保存并传播一些梯度。然而,这样做是不是总是能提高算法性能并不清楚(有时候实验结果反而显示性能更差),所以通常还是使用0来初始化偏置参数。
批量归一化(Batch Normalization):
批量归一化可以理解为在网络的每一层之前都做预处理,只是这种操作以另一种方式与网络集成在了一起。其做法是让激活数据在训练开始前通过一个网络,网络处理数据使其服从标准高斯分布。因为归一化是一个简单可求导的操作,所以上述思路是可行的。在实现层面,应用这个技巧通常意味着全连接层(或者是卷积层,后续会讲)与激活函数之间添加一个BatchNorm层。在实践中,使用了批量归一化的网络对于不好的初始值有更强的鲁棒性。
正则化 Regularization
有不少方法是通过控制神经网络的容量来防止其过拟合的:
也就是说,使用L1正则化的神经元最后使用的是它们最重要的输入数据的稀疏子集,同时对于噪音输入则几乎是不变的了。相较L1正则化,L2正则化中的权重向量大多是分散的小数字。在实践中,如果不是特别关注某些明确的特征选择,一般说来L2正则化都会比L1正则化效果好。
随机失活(Dropout)
是一个简单又极其有效的正则化方法。该方法由Srivastava在论文Dropout: A Simple Way to Prevent Neural Networks from Overfitting中提出的,与L1正则化,L2正则化和最大范式约束等方法互为补充。在训练的时候,随机失活的实现方法是让神经元以超参数
的概率被激活或者被设置为0。
在训练过程中,随机失活可以被认为是对完整的神经网络抽样出一些子集,每次基于输入数据只更新子网络的参数(然而,数量巨大的子网络们并不是相互独立的,因为它们都共享参数)。在测试过程中不使用随机失活,可以理解为是对数量巨大的子网络们做了模型集成(model
ensemble),以此来计算出一个平均的预测。
超级多分类的分类器的选择:分层Softmax
类别数目巨大。当标签集非常庞大(例如字典中的所有英语单词,或者ImageNet中的22000种分类),就需要使用
CNN部分:
颜色通道在网络中在哪里体现(多个通道的卷积结果相加在取激活函数得到的)
激活数据体维度:[32,32,12] 32表示输入数据的尺寸,12表示卷积核的个数
滤波器,(也是卷积核,他的尺寸(5*5*3,3需要和通道数相同)),这里如果这一层有12个滤波器,则数据体就有12的深度。
数据体中,左右神经元的参数相同,因为使用的是同一个滤波器。
感受野,也就是滤波器的尺寸,,感受野的深度就是滤波器的深度,和输入数据的深度一致,比如通道数是3,则感受野的深度也是3
每个神经元的权重,等于滤波器的长乘以宽再乘以感受野的深度
超级参数:深度,步长,0填充
计算每一层的神经元个数,比如数据体是 55*55*96这样的,则神经元个数是55*55*96个,每个神经元有11*11*3(感受野的尺寸)
假设每个Fibre(也就是2维切片上的55*55个神经元都是用同养的参数集合)
反向传播的时候,都要计算每个神经元对它的权重的梯度,但是需要把同一个深度切片上的所有神经元对权重的梯度累加,这样就得到了对共享权重的梯度。这样,每个切片只更新一个权重集。
在一个深度切片中,每个滤波器都被55x55个神经元共享。注意参数共享的假设是有道理的:如果在图像某些地方探测到一个水平的边界是很重要的,那么在其他一些地方也会同样是有用的,这是因为图像结构具有平移不变性。所以在卷积层的输出数据体的55x55个不同位置中,就没有必要重新学习去探测一个水平边界了。

注意有时候参数共享假设可能没有意义,特别是当卷积神经网络的输入图像是一些明确的中心结构时候。这时候我们就应该期望在图片的不同位置学习到完全不同的特征。一个具体的例子就是输入图像是人脸,人脸一般都处于图片中心。你可能期望不同的特征,比如眼睛特征或者头发特征可能(也应该)会在图片的不同位置被学习。在这个例子中,通常就放松参数共享的限制,将层称为局部连接层(Locally-Connected Layer)。
- 由于参数共享,每个滤波器包含
个权重,卷积层一共有
个权重和
个偏置。 - 在输出数据体中,第
个深度切片(空间尺寸是
),用第
个滤波器和输入数据进行有效卷积运算的结果(使用步长
),最后在加上第
个偏差。
汇聚层
作用:在连续的卷积层之间会周期性地插入一个汇聚层。它的作用是逐渐降低数据体的空间尺寸,这样的话就能减少网络中参数的数量,使得计算资源耗费变少,也能有效控制过拟合。
在实践中,最大汇聚层通常只有两种形式:一种是
,也叫重叠汇聚(overlapping pooling),另一个更常用的是
。对更大感受野进行汇聚需要的汇聚尺寸也更大,而且往往对网络有破坏性。
除了最大汇聚,汇聚单元还可以使用其他的函数,比如平均汇聚(average pooling)或L-2范式汇聚(L2-norm pooling)。平均汇聚历史上比较常用,但是现在已经很少使用了。因为实践证明,最大汇聚的效果比平均汇聚要好。
在自生成模型中,不用汇聚层也可以
卷积层和全连接层的相互转换有点不太清楚原理,优点
层的排列规律
INPUT -> [CONV -> RELU -> CONV -> RELU -> POOL]*3 -> [FC -> RELU]*2 -> FC。此处每个汇聚层前有两个卷积层,这个思路适用于更大更深的网络,因为在执行具有破坏性的汇聚操作前,多重的卷积层可以从输入数据中学习到更多的复杂特征。
堆叠两层*3*3感受野的滤波器等于一层感受野为5*5的滤波器
为什么一个7x7的卷积核可以用三个个3x3的卷积核来替代 同理,一个7x7的卷积核可以用三个个3x3的卷积核来替代。 我们假设图片是32*32的 一个7*7卷积 我们使用5*5的卷积核对其卷积,步长为1,不填充 根据计算公式(n+2*p-f)/2 + 1 得到的结果是:(32-7)/1+1=26 三个3*3卷积核 然后我们使用2个卷积核为33的,这里的两个是指进行2层33的卷积: 第一层3*3: 得到的结果是(32-3)/1+1=30 第二层3*3: 得到的结果是(30-3)/1+1=28 第三层3*3: 得到的结果是(28-3)/1+1=26 所以我们的最终结果和7x7的卷积核是一样的,都是26。可以互相替换。 一个7x7的计算量为7x7xchannels = 49xchannels; 两个3*3的计算量为 3x3xchannelsx3 = 27xchannels 所以,三个3x3的卷积的计算量小于一个7x7卷积的计算量 以上是我的理解,如有其它更通俗的理解,欢迎指教。 优点总结 堆叠含有小尺寸卷积核的卷积层来代替具有大尺寸的卷积核的卷积层,并且能够使得感受野大小不变,而且多个3x3的卷积核比一个大尺寸卷积核有更多的非线性(每个堆叠的卷积层中都包含激活函数),使得decision function更加具有判别性。
几个小滤波器卷积层的组合比一个大滤波器卷积层好:假设你一层一层地重叠了3个3x3的卷积层(层与层之间有非线性激活函数)。在这个排列下,第一个卷积层中的每个神经元都对输入数据体有一个3x3的视野。第二个卷积层上的神经元对第一个卷积层有一个3x3的视野,也就是对输入数据体有5x5的视野。同样,在第三个卷积层上的神经元对第二个卷积层有3x3的视野,也就是对输入数据体有7x7的视野。假设不采用这3个3x3的卷积层,二是使用一个单独的有7x7的感受野的卷积层,那么所有神经元的感受野也是7x7,但是就有一些缺点。首先,多个卷积层与非线性的激活层交替的结构,比单一卷积层的结构更能提取出深层的更好的特征。其次,假设所有的数据有
个通道,那么单独的7x7卷积层将会包含
个参数,而3个3x3的卷积层的组合仅有
个参数。直观说来,最好选择带有小滤波器的卷积层组合,而不是用一个带有大的滤波器的卷积层。前者可以表达出输入数据中更多个强力特征,使用的参数也更少。唯一的不足是,在进行反向传播时,中间的卷积层可能会导致占用更多的内存。
那个为什么要乘以两次C呀。 每个神经元的参数是3*3*C,然后,深度也是和上层的深度一样,所以是3*3*c*c,个数3个所以是27C²
层的尺寸设置规律
输入数据,尺寸(2的倍数)
卷积层,较小的尺寸滤波器
著名的模型:
Lenet:第一个神经网络结构(一个卷积,一个汇聚接着)
AlexeNEt,2012的经典模型,(用了层叠的卷积层,而不是马上跟上汇聚层)
ZF Net:对Alex的改进,通过减小第一层的步长以及滤波器尺寸。增加了中间卷积层的尺寸
Google Net: 2014的第一名 Inception_4 ,没有使用全连接层,使用了一个平均汇聚层,除此采用了一个奠基模块(不清楚干嘛的)。因此参数的数量很小
Inception_V3 :层数22层,参数较少。四个分支,可以得到特征变化,高效提升网络的深度和宽度。112*112
VGG:2014第二名,深度影响结果的体现。16层卷积,排布一致,卷积3*3,汇聚2*2.网络开销太大,参数太多,大多数来自于第一层全连接层。
ResNet:2015的优胜者,它使用了特殊的跳跃链接,大量使用了批量归一化(batch normalization)。这个结构同样在最后没有使用全连接层。ResNet当前最好的卷积神经网络模型。参考了VGG的架构,
问题引入: 深度太深了也造成了退化功能。
原理,每两层之间加入了短路机制,每次的残差值F(x)=H(x)-x; H(x)表示其学习到的特征,当残差F(x)为0,则是恒等映射。 56层的网络这样的话至少会和20层效果一样,不会出现效果退化。残差结构使得梯度反向传播时,更不易出现梯度消失等问题,由于Skip Connection的存在,梯度能畅通无阻地通过各个Res blocks,下面我们来推导一下 ResNet v2 的反向传播过程。
下面我们来具体看一下一个残差块是怎么实现的,如下图所示的basic-block,输入数据分成两条路,一条路经过两个3*3卷积,另一条路直接短接,二者相加经过relu输出,十分简单。


平均池化:
1.节省计算资源,不需要参数。相比传统的分类网络,这里接的是池化,而不是全连接层。池化是不需要参数的,相比于全连接层可以砍去大量的参数。对于一个7x7的特征图,直接池化和改用全连接层相比,可以节省将近50倍的参数,作用有二:一是节省计算资源,二是防止模型过拟合,提升泛化能力;
输入图像尺寸是112*112