Machine Learning - 李宏毅 学习笔记 (5)

给我们第一个层的某个参数加上△w时,对输出与目标之间的损失有某种形式的变化。现在我们的△w很大,通过sigmoid函数时这个输出会很小(一个大输入,,通过Sigmoid函数,得到较小的输出),每经过一次sogmoid函数就会衰减一次(因为sogmoid函数将值压缩到0到1之间,将参数变化衰减),隐藏层很多的情况下,最后对损失的影响非常小,看作是梯度消失了。(对输入修改一个参数其实对输出是影响是非常小)。

理论上我们可以设计动态学习率来避免梯度消失这个问题,但是如果直接改激活函数更为直接,eg. 使用ReLU,具体好处可以看论文笔记< AlexNet - 论文研读系列(1) 个人笔记 >

ReLU还有两种优化改进:分别是Leaky ReLU和Parametric ReLU。除此之外,激活函数还有ELU,和一种可以让网络自动学习的激活函数,这种称之为Maxout。

Maxout就是将前输出Zi每k个划分为一个Group,每个Group只输出最大的,其他k-1个舍弃。Maxout的拟合能力是非常强的,它可以拟合任意的的凸函数。但是它同dropout一样需要人为设定一个k值,这使得应用Maxout的层的参数个数成k倍增加,原本只需要1组就可以,采用Maxout之后就需要k倍了。

Tips3 适应性学习率:

Adagrad

RMSprop

Momentum 动量

Adam

Tips4 测试集效果差:

Early Stopping

Regularization

Dropout

Dropout能够提升模型性能有很多理由,其中一种比较能接受的理由是:Dropout是一个终极ensemble方法

ensemble的意思是:我们有一个很大的训练集,每次从训练集里面只取样一部分的数据。

第十三章 Keras - 手写数字识别(2)

把激活函数换成了relu,结果accuracy非常高,test上都有95.64%。

归一化:x_train=x_train/255,x_test=x_test/255,对结果影响非常大,直接从原来的95.64%降低到了10%

把优化器SGD改成了Adam,发现最后收敛的地方查不到,但是上升速度特别快。

假设给测试集上每个像素点随机加上噪声,结果发现准确率直接掉到了56%,说明在生成对抗网络这方面很重要。

在噪声的基础上使用dropout(因为训练集好测试集差),训练集有少许下降,但是测试集正确率有所提升。

第十四章 卷积神经网络

全连接 vs. 卷积网络

全连接Dence需要将矩阵拉成矢量. eg. 输入100 * 100 * 3的像素拉成的30000维,会极大增加网络参数

CNN相比简化网络架构,使用卷积会对输入进行过滤。

CNN卷积核

对于一张图来说,比如我们需要检测鸟嘴其实只需要检测图片的一个小区域即可。每一个卷积核要做的事就是发现某一种模式,有没有某种模式的出现,这样不用对整张图片进行处理,可以减少参数。

同样的模式在图像里面,可能出现在图像的不同部分,但是代表的是同样的含义同样的形状,所以卷积核需要从头扫描到尾,这样不需要多个相同功能的神经元,减少了需要参数的量。

对于一个图像而言,我们可以把奇数行,偶数列的像素拿掉,变成原来十分之一的大小,依然不会影响人对该图的理解。所以即使我们对图像进行subsumpling子采样,减少了需要的参数和输出维度大小,也不会造成差异。

CNN架构:

输入图像,通过卷积层convolution卷积操作,再通过池化层做max pooling等池化操作。几层卷积几层池化全部是超参数需要人工调参。之后将卷积或者池化输出flatten展平连接到完全连接前馈网络FCN得到结果

卷积 - 生成模式并观察,通用的模式找到目标。池化 - 对卷积结果进行子采样减少参数。

Convolution卷积:Filter卷积核/过滤器 三种填充模式(full,same,valid - padding)stride 步长 卷积核大小 卷积核数量 输入图像大小 计算输出大小 卷积核点乘计算

Max Pooling最大池化:Filter池化过滤器 也是三种模式 stride 步长 Filter池化核大小 计算输出大小

第一层:卷积层1,输入为3@227x227的图像,卷积核的数量为96(自定义); 卷积核的大小为3@11x11(自定义); stride = 4(自定义), stride表示的是步长, pad = 0, 表示不扩充边缘;
wide = (227 + 2 x padding - kernel_size) / stride + 1 = 55
height = (227 + 2 x padding - kernel_size) / stride + 1 = 55
dimention = 96
最终第一层卷积的输出为96@55x55
参数个数:3*11*11*96=34848
第二层:池化层1,输入96@55x55矩阵,池化pool_size = (3, 3), stride = 2, pad = 0,最后输出96@27x27

CNN in Keras:

创建卷积层:model.add(Convolution2D(..., input_shape()))

eg. model.add(Convolution2D(25,3,3,input_shape(28,28,1)))

25个3 * 3的卷积核

创建的不是vector,而是一个tensor三维张量,1@28 * 28

创建池化层:model.add(MaxPooling2D())

eg. model.add(MaxPooling2D(2,2))

表示池化区域2 * 2

将张量展开向量:model.add(Flatten())

CNN学到了什么?

第一层卷积每个filter在对输入的图像进行过滤,试图捕捉到什么东西。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwsszd.html