官方文档:https://keras.io/layers/convolutional/#zeropadding2d
https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html VGG16架构
https://www.cnblogs.com/ymjyqsx/p/9451739.html
【搬运】conv卷积层:
1.相当于一个特征提取器(特征增强,消除噪声)
2.提供了位置信息
3.减少了参数个数
https://blog.csdn.net/m0_37622530/article/details/82230368
https://www.cnblogs.com/ymjyqsx/p/9451739.html
【搬运】pooling池化层:
1.提取特征(减少之前的特征维数) 2.减少训练参数
3.进而防止过拟合(泛化能力加强)。 激活函数:增加网络的非线性表达能力。
1 过滤越来越多的卷积层,提取越来越高级的特征
2 Max pooling和Global Average Pooling用来只保留这些特征中最强的,保证特征的位置与旋转不变性,减少模型参数数量,减少过拟合问题
————————————————————————————
https://blog.csdn.net/qq_39521554/article/details/81385159
【半搬运】对全连接层(fully connected layer)的通俗理解:
全连接层(fully connected layers,FC)(通过矩阵向量乘积)在整个卷积神经网络中起到“分类器”的作用。如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则对前面的特征(通过“全局平均值global average pooling”的方法减少全连接的参数)做加权和,将学到的“分布式特征表示”(高度提纯的特征)映射到样本标记空间。
https://blog.csdn.net/wangyuxi__/article/details/82714647
全连接层:连接所有的特征,将输出值送给分类器(如softmax分类器)。
【https://blog.csdn.net/m0_37407756/article/details/80904580
卷积取的是局部特征,全连接就是把以前的局部特征重新通过权值矩阵组装成完整的图。因为用到了所有的局部特征,所以叫全连接。】
【分布式特征表示:XR理解:数据间如何相互关联的信息。参考:
https://blog.csdn.net/zkh880loLh3h21AJTH/article/details/80326188 】
【样本空间:所有可能存在的、合理的、情况的集合。参考:
https://blog.csdn.net/csucsgoat/article/details/79598803)】
在实际使用中,全连接层可以转化为卷积核为1x1的卷积。
https://www.cnblogs.com/ymjyqsx/p/9451739.html
卷积层本来就是全连接的一种简化形式:不全连接+参数共享,把局部视野之外的弱影响直接抹为零影响,同时还保留了空间位置信息(卷积层不同位置的权值共享)。这样大大减少了参数并且使得训练变得可控。
【1x1卷积层的作用: https://blog.csdn.net/junmuzi/article/details/78219336
https://blog.csdn.net/chaipp0607/article/details/60868689
1、降维(dimension reductionality )。比如,一张500 x 500且厚度depth为100的图片在20个filter上做1x1的卷积,那么结果的大小为500x500x20。降低通道数(厚度)而不改变图片长宽。
2、加入非线性。卷积层之后经过激励层,1x1的卷积在前一层的学习表示上添加了非线性激励( non-linear activation),提升网络的表达能力。】
卷积层与全连接层之间的过渡层(将多维输入一维化Flatten)。
model.add(Flatten())将最后一个池化层的长宽厚进行展平输出向量,不影响批量大小,方便将该结果接入全连接层。
为了提升 CNN网络性能,全连接层每个神经元的激励函数一般采用ReLU函数。最后一层全连接层的输出值被softmax逻辑回归(softmax regression)分类,这层也被称作softmax层。
https://www.cnblogs.com/lc1217/p/7324935.html
【搬运】卷积神经网络结构图:
https://blog.csdn.net/blateyang/article/details/79101339
【搬运】关于深度学习中的Batch normalization的理解:
BN的原理:
批规范化(Batch normalization)是深度学习中经常见到的一种训练trick,指在采用梯度下降法训练DNN时,对网络层中每个mini-batch的数据进行归一化,使其均值变为0,方差变为1,其主要作用是缓解DNN训练中的梯度消失/爆炸现象,加快模型的训练速度。
BN的好处和原因:
BN使用的注意点
是沿着数据的batch size方向做规范化。对于二维张量形式的数据X(N,D),即沿着dim=0方向计算均值和方差;对于四维张量形式的图像数据X(N,C,H,W),把它reshape成X(NHW,C),再沿着dim=0方向计算均值和方差,计算完之后再reshape回去,此时叫做Spatial BN。
测试阶段BN的均值和方差不再是基于batch计算的,而是使用固定的统计参数(根据训练阶段各mini-batch计算出的均值和方差得到,详见原论文(上面链接中))
https://www.cnblogs.com/paulonetwo/p/10078961.html
BatchNormalization使用:
model.add(Conv2D(16, (3, 3), strides=(1, 1), padding='valid'))
model.add(MaxPooling2D((2, 2)))
model.add(BatchNormalization())
model.add(Activation('relu'))
https://www.cnblogs.com/skyfsm/p/8453498.html
BN在深层神经网络的作用非常明显:若神经网络训练时遇到收敛速度较慢,或者“梯度爆炸”等无法训练的情况发生时都可以尝试用BN来解决。同时,常规使用情况下同样可以加入BN来加速模型训练,甚至提升模型精度。
——————————————————————————
XR代码与运行结果:(#后面是注释)
from keras.layers import Conv2D, MaxPooling2D, GlobalAveragePooling2D
from keras.layers import Dropout, Flatten, Dense
from keras.models import Sequential
model = Sequential()
model.add(Conv2D(filters=16,#输出的维度Output Shape在这里插入代码片的最后一个维度的值
kernel_size=2, strides=1, padding='valid', #卷积核滤波器的高和宽的值均为2 #移动步幅为1 #valid 丢弃,same补零
activation='relu',#如果未指定任何值,则不应用任何激活函数
input_shape=(224, 224, 3))) #之前加载RGB图像过后缩放为 224×224 的图像,有3个通道(转化张量格式)
#卷积层中的参数数量Param = (过滤器数量 * 过滤器高度 * 过滤器宽度 * 上一层深度即上一层过滤器数量)+ 过滤器数量
# = (过滤器数量 * 每个过滤器的权重数量) + 过滤器数量
# = (卷积层的权重总数) + 过滤器数量
# = (卷积层的权重总数) + 每个过滤器有 1 个偏差项因此卷积层*共有过滤器数量个偏差
# = (每个过滤器的偏差项 1+ 上一层过滤器的权重数量)* 这一层过滤器数量
# = (16 * 2 * 2 * 3)+16 = 208
model.add(MaxPooling2D(pool_size=2))
#池化层的输出: ((输入进的卷积层高度-池化窗口高度+1)/步幅长度) * ((输入进的卷积层宽度-池化窗口宽度+1)/步幅长度) ,输出的最后一个维度(厚度)等于经过上一层卷积滤波器后输入进池化层的数量
#如果padding='same',那时池化层的输出:((输入进的卷积层高度)/步幅长度) * ((输入进的卷积层宽度)/步幅长度)
model.add(Conv2D(filters=32,
kernel_size=2, strides=1, padding='valid',
activation='relu',
) )
model.add(MaxPooling2D(pool_size=2))
model.add(Conv2D(filters=64,
kernel_size=2, strides=1, padding='valid',
activation='relu',
) )
model.add(MaxPooling2D(pool_size=2))
model.add(GlobalAveragePooling2D(data_format='channels_last'))#缩小的因子(dim1,dim2)只有图像的长和宽,因此该空间数据的全局最大池操作是二维
model.add(Dense(133, activation='softmax'))
#Total params: 19,189 = 208+2080+8256+8645
model.summary()
#卷积层中的参数数量Param = (过滤器数量
x 过滤器高度
x 过滤器宽度
x 上一层深度即上一层过滤器数量
)+ 过滤器数量
# = (过滤器数量
x 每个过滤器的权重数量) + 过滤器数量
# = (卷积层的权重总数) + 过滤器数量
# = (卷积层的权重总数) + 每个过滤器有 1 个偏差项因此卷积层 x 共有过滤器数量个偏差
# = (每个过滤器的偏差项 1+ 上一层过滤器的权重数量) x(连接至) 这一层过滤器数量 【XR理解】
不同基本CNN结构原理:http://cs231n.github.io/convolutional-networks/#architectures
【搬运】
最常见的ConvNet架构遵
循以下模式:
INPUT -> [[CONV -> RELU]*N -> POOL?]*M -> [FC -> RELU]*K -> FC
其中,*表示重复,POOL?表示可选的池层。而且,N >= 0(通常N <= 3)M >= 0,K >= 0(和通常K < 3)。例如,以下是您可能会看到的一些常见的ConvNet架构,遵循以下模式:
INPUT -> FC,实现线性分类器。在这里N = M = K = 0。
INPUT -> CONV -> RELU -> FC
INPUT -> [CONV -> RELU -> POOL]*2 -> FC -> RELU ->FC。
在这里,我们看到每个POOL层之间都有一个CONV层。
INPUT -> [CONV -> RELU -> CONV -> RELU -> POOL]*3 -> [FC -> RELU]*2 -> FC
在这里,我们看到在每个POOL层之前堆叠了两个CONV层。对于更大更深的网络而言,这通常是一个好主意,因为多个堆叠的CONV层可以在破坏性池化操作之前开发输入卷的更复杂的特征。
优选将一叠小滤波器CONV连接到一个大的感受野CONV层。
改进点:1 Batch normalization layer用来解决Covariate Shift的问题
2 Dropout layer用来降低模型复杂度,增强模型的泛化能力,防止过拟合,顺带降低了运算量