p55:1.pooling:下采样:即把特征集变小,有降维的作用。对于图片数据而言,可能是各行采样;而对于卷积神经网络而言,是池化层,如果是最大池化的话,那就是在窗口中选择最大值输出;如果是平均池化的话,那就是对窗口中的数据求平均值,并将平均值输出。
pytorch实现:
说明:nn,MaxPool2d(2,stride=2):第一个参数表示窗口的大小,第二个参数表示窗口移动的步长。
2.upsample:上采样,类似于图片放大。
pytorch实现:
说明:F.interpolate(x,scale_factor=2,mode=’nearest’):第一个参数表示tensor,第二个参数表示放大倍数,第三个参数表示插值方式,这里采用最近邻插值。
3.ReLU:
pytorch实现:
p56:1.为什么要进行Batch-Norm?:将数据映射到服从N(0,std)的区间上,避免出现梯度离散的现象。
2.这样的缩放(Feature scaling)有什么作用?:(1)图像归一化(image normalization)
p57:1.(2)批归一化(Batch normalization)
pytorch实现:1)1维
原理:先求均值和方差,然后归一化,再用学习到的β和γ进行缩放,得到N(β,γ)分布。
running的均值和方差还需要根据当前的均值和方差进行更新,同时β和γ也需要梯度信息进行自动的更新。
2)2维
说明:afine表示β和γ是否需要自动更新,一般都设置为True。
2.test时,可能只有一个测试案例,所以是无法取到batch的均值和方差的,所以test时使用的均值和方差是全局的均值和方差。而且由于test时没有后向传播,所以test时β和γ也是不需要更新的。
注意:test时要先把模式切换过来:layer.eval(),然后再进行Batch Normalization。
3.Batch Normalization的目的就是把数据的均值和方差都变小。
为什么均值不是0,方差不是1?:因为会有β和γ对分布进行调整,所以均值和方差不是0和1。
4.使用了Batch Normalization的好处:
(1)收敛速度更快了;(2)能得到一个更好的解;(3)更稳定了。(参数调整更方便了,超参数的调整没有那么敏感了,learning rate可调整的范围更大了)
p58:1.LeNet-5
2.AlexNet:(1)Max Pooling;(2)ReLU函数;(3)Droptout。
p59:1.VGG:发现更小型的卷积核更好。
2.1x1卷积的一个非常好的特性:可以改变输入和输出的维度,但不改变图片的大小,而且计算量更小。
1x1卷积和3x3卷积现在十分常用。
3.GoogLeNet:对同一层可以使用多个不同类型的卷积核。
并不是简单堆叠层数就可以提升模型效果。由图可见,在堆叠到20层左右的时候,再增加层数,会由于层数过多,训练难度过大,而导致train的效果不好,从而导致模型的效果并不好。因此,简单堆叠层数冰崩你提升模型效果。
p60:1.深度残差网络(ResNet):
(1)初衷:增加了一个短路层(shortcut),来确保30层的网络效果不会比22层的网络效果差。前22层训练后,与后8层并列的有一个短路层,如果后8层的训练效果并不好,那就训练完前22层后走短路层,如果后8层训练得好,那前22层训练完后就走后8层。这样就可以保证30层的网络的效果一定不会比22层的网络差。
(2)具体实施:每隔多少层加一个shaortcut层。
(3)原理网络堆叠单元的结构:,现在ResNet中的堆叠结构:(可能有polling也可能没有)。
(4)实践发现:最好是使用一个2-3层的卷积层,再加一个shortcut的效果比较好。
p61:1.ResNet和Inception计算量并不是很大但性能很好,而VGG计算量很大而且性能不是最好。所以在使用VGG的时候要有先验知识。现在常用ResNet和Inceptioni。
2.pytorch实现ResNet:
(不懂)
3.DenseNet:中间的每一层都有可能和前面的层短接。后面的层是对前面的层的一个综合,它不是对应元素相加,而是拼接,因此其channel会变得很大。因此DenseNet需要很精妙的设计才能使其计算量不是很大。
p62,63:1.nn.Module是所有网络层次的类的一个父类。当你要自己实现一个层的时候,必须要继承自这个类。
2.使用nn.Module有什么好处?
(1)提供了许多现成的神经网络的计算模块。
(2)作为一个容器:一个网络包含很多层(如:152层),那就需要152次前向传播,使用这个模块可以写一次前向传播,他就会帮你完成152次前向传播,不需要你手动地写那么多次。
(3)会对网络中的参数进行一个有效的管理。
(4)对网络内部的module的管理。
(不懂)
(5)可以把函数和方法方便地从gpu转移到cpu上面。
(讲解不懂)
(6)加载和保存:保存状态,预防断电,系统崩溃等意外情况的发生。
(7)可以方便地切换train和test的状态。
(8)实现自己的类Flatten:打平操作(可直接抄),使用十分广泛。
(9)实现自己的线性层。
p64:1.数据增强:使原来的数据变得多样化,增加数据量。
2.如何针对有限的数据进行优化?:(1)减少网络的参数量,避免过拟合;(2)加一些正则项,迫使网络的部分权值接近于0;(3)对原来的数据进行数据增强(如对照片进行裁剪,旋转,变色等操作)。
3.常用的数据增强方法:
(1)翻转:做不做翻转操作有一定的随机性;
(2)旋转;
说明:第一个15表示在[-15,15]区间内进行旋转,随机的一个角度;第二个[90,180,270]表示在这三个角度中选一个角度进行旋转。
(3)随即移动,裁剪和缩放;
缩放:
注意:传入参数的形式是一个list,[32,32]。
裁剪:
还可以加白噪声。
(4)GAN。
4.数据增强对模型表现有帮助,但不会提高太多。
p65:1.presentation/word embedding:将序列数据转换成数值数据,因为pytorch没有string数据类型,都是数值类型。
2.:第一个参数表示序列长度(如词语长度),第二个参数表示每个词的表示方法(即用几维向量表示)。
3.word embedding方法有:(1)one-hot encoding;
缺点:维度高,稀疏,无法表示语义间的关系(相关,相反等)。
(2)word2vec;
(3)glove。
4.批量embedding的两种形式:
(未完,待续~)