分享一些最近看到的深度学习文章,大概整理了一些基础知识作为入门,
1.1 网络结构
AlexNet有5个卷积层和3个全连接层
C1:96×11×11×3 (卷积核个数/宽/高/深度) 34848个
C2:256×5×5×48(卷积核个数/宽/高/深度) 307200个
C3:384×3×3×256(卷积核个数/宽/高/深度) 884736个
C4:384×3×3×192(卷积核个数/宽/高/深度) 663552个
C5:256×3×3×192(卷积核个数/宽/高/深度) 442368个
R1:4096×6×6×256(卷积核个数/宽/高/深度) 37748736个
R2:4096×4096 16777216个
R3:4096×1000 4096000个
共6000万个参数
1.2 AlexNet模型内存大小计算
6000万(个参数)×32位(float32)=19.2亿位≈228.88MB
1.3 AlexNet模型计算力消耗
卷积神经网络有三种层:卷积层、池化层和全连接层(Convolutional Layer, Pooling Layer, 及 Fully-Connected Layer)。 以处理CIFAR-10的卷积神经网络为例,简单的网络应包含这几层: [INPUT - CONV - RELU - POOL - FC]也就是[输入-卷积-激活-池化-分类],各层分述如下:
注意: 1. 卷及神经网络包含不同的层 (e.g. CONV/FC/RELU/POOL 也是最受欢迎的) 2. 每一层都输入输出3d结构的数据,除了最后一层 3. 有些层可能没有参数,有些层可能有参数 (e.g. CONV/FC do, RELU/POOL don’t) 4. 有些层可能有超参数有些层也可能没有超参数(e.g. CONV/FC/POOL do, RELU doesn’t)
下面展开讨论各层具体细节:
卷积层是卷积神经网络的核心层,大大提高了计算效率。 卷积层由很多过滤器组成,每个过滤器都只有一小部分,每次只与原图像上的一小部分连接,UFLDL上的图:
这是一个过滤器不停滑动的结果, 我们这里要更深入些,我们输入的图像是一个三维的,那么每个过滤器也是有三个维度,假设我们的过滤器是5x5x3的那么我们也会得到一个类似于上图的激活值的映射也就是convolved feature 下图中叫作 activion map,其计算方法是wT×x+bwT×x+b其中w是5x5x3=75个数据,也就是权重,他是可以调节的。 我们可以有多个过滤器:
更深入一些,当我们滑动的时候有三个超参数: 1. 深度,depth,这是过滤器的数量决定的。 2. 步长,stride,每次滑动的间隔,上面的动画每次只滑动1个数,也就是步长为1. 3. 补零数, zero-padding,有时候根据需要,会用零来拓展图像的面积,如果补零数为1,变长就+2,如下图中灰色的部分就是补的0
下面是一个一维的例子:
其输出的空间维度计算公式是
(W−F+2P)/S+1(W−F+2P)/S+1
其中w是输入的尺寸,f是过滤器的尺寸,p是补零的尺寸,s是步长,图中如果补零为1那么输出为5个数,步长为2输出为3个数。 到现在为止我们好像都没有涉及到 神经这个概念哇,现在我们就从神经角度来理解: 上面提到每一个激活值都是:wT×x+bwT×x+b,这个公式我们熟悉哇,这就是神经元的得分公式呀,所以我们可以将每一个 activation map 其看做是一个filter的杰作,如果有5个过滤器,就会有5个不同的filter同时连接一个部分。 卷积神经网络还有一个重要的特征: 权重共享:在同一个filter上的不同的神经单元(滑动窗口)的权重是相同的。这样以来大大减少了权重的数量。
上面可以知道在卷积层之后得到的结果还是挺多,而且由于滑动窗口的存在,很多信息也有重合,于是有了池化pooling 层,他是将卷积层得到的结果无重合的分来几部分,然后选择每一部分的最大值,或者平均值,或者2范数,或者其他你喜欢的值,我们以取最大值的max pool为例:
全连接层和卷积层除了连接方式不一样,其计算方式都是内积,可以相互转换: 1. FC如果做CONV layer 的工作就相当于其矩阵的多数位置都是0(稀疏矩阵)。 2. FC layer 如果被转变为 CONV layer. 相当于每一层的局部连接变为了全部链接如FC layer with K=4096的输入是7×7×512那么对应的卷积层为 F=7,P=0,S=1,K=4096输出为1×1×4096。 例子: 假设一个cnn输入 224x224x3图像,经过若干变化之后某一层输出 7x7x512 到这里之后使用两4096的FC layer及最后一个1000的FC计算分类得分下面是把这三层fc转化为Conv 的过程: 1. 使用 F=7的conv layer 输出为 [1x1x4096]; 2. 使用F=1的过滤器,输出为 [1x1x4096]; 3. 使用F=1的卷积层,输出为 [1x1x1000]。
每次转化都会将FC的参数转变为conv的参数形式. 如果在转变后的系统中传入更大的图片,也会非常快速的向前运算。例如将384x384的图像输入上面的系统,会在最后三层之前得到[12x12x512]的输出, 经过上面转化的conv 层会得到 [6x6x1000], ((12 - 7)/1 + 1 = 6). 我们一下就得出了6x6的分类结果。 这样一次得到的比原来使用迭代36次得到的要快。这是实际应用中的技巧。 另外我们可以用两次步长16的卷积层代替一次步长为32的卷积层来输入上面的图片,提高效率。
3、模型训练相关的专业术语解释
Step: 训练模型的步数
Batch Size(批尺寸):计算梯度所需的样本数量,太小会导致效率低下,无法收敛。太大会导致内存撑不住,Batch Size增大到一定程度后,其下降方向变化很小了,所以Batch Size是一个很重要的参数。
为什么需要有 Batch_Size :
batchsize 的正确选择是为了在内存效率和内存容量之间寻找最佳平衡。
Epoch(回合):代表样本集内所有的数据经过了一次训练。
每个 epoch 都会进行shuffle,对要输入的数据进行重新排序,分成不同的batch。
Iteration(迭代):
理解迭代,只需要知道乘法表或者一个计算器就可以了。迭代是 batch 需要完成一个 epoch 的次数。记住:在一个 epoch 中,batch 数和迭代数是相等的。
比如对于一个有 2000 个训练样本的数据集。将 2000 个样本分成大小为 500 的 batch,那么完成一个 epoch 需要 4 个 iteration。
变量 | 含义 |
---|---|
epoch | 一个epoch表示所有训练样本运算学习一遍 |
iteration/step | 表示每运行一个iteration/step,更新一次参数权重,即进行一次学习,每一次更新参数需要batch size个样本进行运算学习,根据运算结果调整更新一次参数。 |
batch size | 1次迭代所使用的样本量 |
其关系为:
举例: 假设有20000个样本,batch size 为200,epoch为1, 则
CIFAR10 数据集有 50000 张训练图片,10000 张测试图片。现在选择 Batch Size = 256 对模型进行训练。
每个 Epoch 要训练的图片数量:50000
训练集具有的 Batch 个数:50000/256 = 195 +1 = 196
每个 Epoch 需要完成的 Batch 个数:196
每个 Epoch 具有的 Iteration 个数:196
每个 Epoch 中发生模型权重更新的次数:196
训练 10 代后,模型权重更新的次数:196 * 10