首页天道酬勤卷积神经网络实现(卷积神经网络计算)

卷积神经网络实现(卷积神经网络计算)

张世龙 12-21 18:51 100次浏览

2014年,牛津大学计算机视觉集团(Visual Geometry Group )与谷歌深度卷积神经网络(Google DeepMind )的研究员一起开发了新的深度卷积神经网络) VGGNet,ILS VRVR

可以把VGG看成是深度版的AlexNet,整个网络是卷积层和所有连接层重叠的。 与AlexNet不同,VGG中使用了小尺寸的卷积核(3333 )。

VGG的特征

结构简洁,下图的VGG-19的网络结构 )。

相比之下,前面介绍的网络结构图,有赏心悦目的感觉吗? 整体结构只有3333的卷积层,连续的卷积层之后被池化层分隔。 层数很多,但很简洁。

小的卷积核和连续的卷积层VGG都使用3333的卷积核,使用连续的多个卷积层。 这样做的好处是使用连续的多个小卷积核(3333 )代替一个大卷积核) )例如) 5555 )。 使用小卷积核的问题是其感受野必然变小。 因此,在VGG中,使用连续的3333卷积核,增大感受野。 VGG认为连续的两个3333卷积核代替了一个5555卷积核,连续的三个3333代替了一个7777。

卷积核的参数少。 3个3333的卷积核参数为33=2733=27,而1个7777的卷积核参数为77=4977=49。 由于每个卷积层都有非线性激活函数,因此在多个卷积层中添加了非线性映射。 小池化核表示2222通道数更多、特征度更宽的每个通道一个FeatureMap,更多通道表示更丰富的图像特征。 VGG网络一层的频道数为64,每后一层增加一倍,最多为512个频道,频道数增加,可以提取更多的信息。 层数更深时,用连续的小卷积核代替大卷积核,网络深度更深,边缘填充。 卷积过程不会降低图像大小。 只使用小的池化单元,缩小图像的大小。 全连接卷积(测试阶段)这也是VGG的特征之一。 在网络测试阶段,将训练阶段的三个全部连接替换为三个卷积。 由于测试得到的全体积网络没有全连接的限制,所以在测试阶段能够接收任意宽度或高度的输入是重要的。 如本节第一幅图所示,输入图像为224x224x3。 如果以下三层都是全连接,在测试阶段,测试图像必须全部放大缩小到224x224x3,才能满足下一个全连接层输入数的要求,测试工作的开展很不方便。 全连接卷积的置换过程如下。 )。

例如,为了将7751277512层与4096个神经元层完全连接,将7751277512层置换为通道数4096,将卷积核置换为1111卷积。

这个“全连接卷积”的想法是VGG的作者参考了OverFeat的工作想法,例如下图是OverFeat将全连接转换为卷积后,可以以任意分辨率(整个图)计算卷积,因此需要重新缩放原图

VGG网络结构

虽然VGG网络与AlexNet相比占有相当多的层数,但是其结构相当简单。

VGG的输入为22422432242243的图像对图像进行平均值的预处理,按像素减去通过训练集计算出的RGB平均值。 网络使用连续的小卷积核(3333 )进行连续卷积,以卷积的固定步骤为1,在图像的边缘填充1个像素,从而保持卷积后的图像分辨率恒定。 连续的卷积层后面是池化层,导致图像分辨率下降。 空间池化由五个最大池化层完成,这些层位于几个卷积层之后。 并非所有的卷积层之后都将进行最大池化。 在22像素窗口中进行最大池化,步长为2。 在卷积层之后,紧接着有三个全部连接层,前两个分别有4096个通道,第三个是输出层输出1000的分类。 的隐层激活函数都是ReLU使用1111的卷积核,为了增加非线性激活函数的个数,且不影响卷积层的感受野。 由于没有使用局部归一化,作者发现局部归一化不能提高网络的性能。 VGG论文主要为了研究网络深度对其分类精度的影响,按照上述描述设计了规则,作者对不同深度的网络结构进行了实验

8b70914?from=pc">

所有网络结构都遵从上面提到的设计规则,并且仅是深度不同,也就是卷积层的个数不同:从网络A中的11个加权层(8个卷积层和3个FC层)到网络E中的19个加权层(16个卷积层和3个FC层)。卷积层的宽度(通道数)相当小,从第一层中的64开始,然后在每个最大池化层之后增加2倍,直到达到512。

上图给出了各个深度的卷积层使用的卷积核大小以及通道的个数。最后的D,E网络就是大名鼎鼎的VGG-16和VGG-19了。

AlexNet仅仅只有8层,其可训练的参数就达到了60M,VGG系列的参数就更恐怖了,如下图(单位是百万)

由于参数大多数集中在后面三个全连接层,所以虽然网络的深度不同,全连接层确实相同的,其参数区别倒不是特别的大。

VGG训练与测试

论文首先将训练图像缩放到最小边长度的方形,设缩放后的训练图像的尺寸为S×SS×S。网络训练时对训练图像进行随机裁剪,裁剪尺寸为网络的输入尺寸224×224224×224。如果S=224S=224,则输入网络的图像就是整个训练图像;如果S>224S>224,则随机裁剪训练图像包含目标的部分。

对于训练集图像的尺寸设置,论文中使用了两种方法:

固定尺寸训练,设置S=256S=256和S=384S=384多尺度训练,每个训练图像从一定范围内[Smin,Smax],(Smin=256,Smax=512)[Smin,Smax],(Smin=256,Smax=512)进行随机采样。由于图像中的目标可能具有不同的大小,因此在训练期间考虑到这一点是有益的。这也可以看作是通过尺度抖动进行训练集增强,其中单个模型被训练在一定尺度范围内识别对象。

网络性能评估

单尺度评估,测试图像固定尺度。结果如下表

通过评估结果,可以看出:局部归一化(A-LRN)网络,对网络A的结果并没有很大的提升。网络的性能随着网络的加深而提高。应该注意到B,C,D这个网络的性能。C网络好于B网络,说明额外添加的非线性激活函数,确实是有好处的;但是,D网络好于C网络,这说明也可以使用非平凡的感受野( non-trivial receptive fields)来捕获更多的信息更有用。当网络层数达到19层时,使用VGG架构的错误率就不再随着层数加深而提高了。更深的网络应该需要更多的数据集。论文还将网络B与具有5×5卷积层的浅层网络进行了比较,浅层网络可以通过用单个5×5卷积层替换B中每对3×3卷积层得到。测量的浅层网络top-1错误率比网络B的top-1错误率(在中心裁剪图像上)高7%,这证实了具有小滤波器的深层网络优于具有较大滤波器的浅层网络。训练时的尺寸抖动(训练图像大小S∈[256,512]S∈[256,512])得到的结果好于固定尺寸,这证实了通过尺度抖动进行的训练集增强确实有助于捕获多尺度图像统计。多尺度评估,测试图像的尺度抖动对性能的影响对同一张测试图像,将其缩放到不同的尺寸进行测试,然后取这几个测试结果的平均值,作为最终的结果(有点像集成学习,所不同的是,这里是测试图像的尺寸不同)。使用了三种尺寸的测试图像:QQ表示测试图像,SS表示训练是图像尺寸:Q=S−32Q=S−32,Q=S+32Q=S+32,前面两种是针对训练图像是固定大小的,对于训练时图像尺寸在一定范围内抖动的,则可以使用更大的测试图像尺寸。Q={Smin,0.5(Smin+Smax),Smax}Q={Smin,0.5(Smin+Smax),Smax}.评估结果如下:

评估结果表明,训练图像尺度抖动优于使用固定最小边S。稠密和多裁剪图像评估Dense(密集评估),即指全连接层替换为卷积层(第一FC层转换到7×7卷积层,最后两个FC层转换到1×1卷积层),最后得出一个预测的score map,再对结果求平均。multi-crop,即对图像进行多样本的随机裁剪,将得到多张裁剪得到的图像输入到网络中,最终对所有结果平均

从上图可以看出,多裁剪的结果是好于密集估计的。而且这两种方法确实是互补的,因为它们的组合优于其中的每一种。由于不同的卷积边界条件,多裁剪图像评估是密集评估的补充:当将ConvNet应用于裁剪图像时,卷积特征图用零填充,而在密集评估的情况下,相同裁剪图像的填充自然会来自于图像的相邻部分(由于卷积和空间池化),这大大增加了整个网络的感受野,因此捕获了更多的图像内容信息。

评估结论

在训练时,可以使用多尺度抖动的训练图像,其精度好于固定尺寸的训练集。测试时,使用多裁剪和密集评估(卷积层替换全连接层)像结合的方法

Keras实现

依照VGG的设计原则,只使用小尺寸的3×33×3卷积核以及2×22×2的池化单元,实现一个小型的网络模型。

class MiniVGGNet: @staticmethod def build(width,height,depth,classes): model = Sequential() inputShape = (height,width,depth) chanDim = -1 if K.image_data_format() == "channels_first": inputShape = (depth,height,width) chanDim = 1 model.add(Conv2D(32,(3,3),padding="same",input_shape=inputShape)) model.add(Activation("relu")) model.add(BatchNormalization(axis=chanDim)) model.add(Conv2D(32,(3,3),padding="same")) model.add(Activation("relu")) model.add(BatchNormalization(axis=chanDim)) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.25)) model.add(Conv2D(64,(3,3),padding="same")) model.add(Activation("relu")) model.add(BatchNormalization(axis=chanDim)) model.add(Conv2D(64,(3,3),padding="same")) model.add(Activation("relu")) model.add(BatchNormalization(axis=chanDim)) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(512)) model.add(Activation("relu")) model.add(BatchNormalization()) model.add(Dropout(0.25)) model.add(Dense(classes)) model.add(Activation("softmax")) return model

最终输出10分类,应用于CIFAR10,表现如下:

小编的这篇文章不知道有多少想学人工智能神经网络的人看的懂!但是我觉得我写的已经够清楚的了。

如果看不懂或者看了这篇文章还想继续深入学习的你可以关注小编来私信我。小编一定会解决你们的问题,让你在人工智能的这条道路上越走越远。

【人工智能】

清华伯克利深圳学院官网(nn.) 神经网络和人工智能原理(神经网络输入神经元个数)