小伙一小时敲出python深度学习框架,AlexNet-8案例分析与实现

卷首语:对于上次详谈CNN的文章,我看到很多负面评论。哎呀我滴个小心脏,不甘心的我也请了我的老友(软件工程专业)作为读者对上一篇文章进行了评判,只见他猛地将一口老白干咽下,眼神迷离的看向远方缓缓吐出一个字“懵”……


小伙一小时敲出python深度学习框架,AlexNet-8案例分析与实现_第1张图片
就这表情

     于此,我也进行了及其深刻的反思,本着写文章应对读者负责,在尽量提高质量的同时,一定一定要再降低一些门槛(门槛??在作者的键盘下是不存在的!

本文范围:

     AlexNet-8案例分析与实现

阅前须知:

     本文分析方面会站在两个GPU通道的基础上进行分析讲解,代码实现采用单GPU进行模拟传播,代码中的参数并非最优,请读者适当加以思考进行改进

AlexNet:

简介:2012ImageNet图像识别大赛冠军,可以说是许多后续DCNN模型开发的参照范例


小伙一小时敲出python深度学习框架,AlexNet-8案例分析与实现_第2张图片
AlexNet

    如上图,我们可以看出该模型分为上下两组通道同时卷积处理。没错,AlexNet的作者利用两台GPU服务器对其进行模型训练。

模型分析:

        上图所示,本模型的深度为八层:五层卷积,三层全连接。

可能产生误解的关键词:

        通道:深度
        LRN:局部相应归一化

卷积类

(在卷积类这里,因为卷积核在两个GPU通道上的工作原理基本一样,所以我会只写一个通道的例子)

Layer-1


小伙一小时敲出python深度学习框架,AlexNet-8案例分析与实现_第3张图片
第一层

输入:长*宽*色深(224*224*3)
卷积:长*宽*通道*步长(11*11*96*4),这里的卷积结果被一分为二,后续将会在两个独立 的GPU上进行同步操作
激活函数:ReLU
池化:最大池化长*宽*步长(3*3*2)
备注:添加LRN
输出:长*宽*通道(27*27*96),且分为两组,每组分别为(27*27*48)

TensorFlow代码实现:

小伙一小时敲出python深度学习框架,AlexNet-8案例分析与实现_第4张图片
(注:实际上,图片参数为256*256*3,Paper作者将其进行了“数据增强”,随机截取224*224大小的图像进行优化训练。但在我看了很多与之相关的博文与Paper后,多数人都认为输入层应采取227*227*3的形式,可以完整的被卷积,从而免去全零填充的过程)

Layer-2


小伙一小时敲出python深度学习框架,AlexNet-8案例分析与实现_第5张图片
第二层

输入:长*宽*通道(27*27*48)
卷积:长*宽*通道*步长(5*5*128*1),且采用全零填充,两个GPU进行同步卷积
激活函数:ReLU
池化:最大池化长*宽*步长(3*3*2)
备注:添加LRN
输出:长*宽*通道(13*13*128)

TensorFlow代码实现:

小伙一小时敲出python深度学习框架,AlexNet-8案例分析与实现_第6张图片
代码

Layer-3


小伙一小时敲出python深度学习框架,AlexNet-8案例分析与实现_第7张图片
第三层

输入:长*宽*通道(13*13*128)
卷积:长*宽*通道*步长(3*3*192*1),且采用全零填充,两个GPU进行同步卷积,输出结 果交叉运算
激活函数:ReLU
输出:长*宽*通道(13*13*192)

TensorFlow代码实现:

(注:在当时我学习此模型时的笔记上认为此步骤主要是为了交换特征,类似于特征归类,两个GPU通道图区的特征也主要分为两类)

Layer-4

小伙一小时敲出python深度学习框架,AlexNet-8案例分析与实现_第8张图片
第四层

输入:长*宽*通道(13*13*192)
卷积:长*宽*通道*步长(3*3*192*1),且采用全零填充,两个GPU进行同步卷积
激活函数:ReLU
输出:长*宽*通道(13*13*192)

TensorFlow代码实现:

代码

Layer-5

小伙一小时敲出python深度学习框架,AlexNet-8案例分析与实现_第9张图片
第五层

输入:长*宽*通道(13*13*192)
卷积:长*宽*通道*步长(3*3*128*1),且采用全零填充,两个GPU进行同步卷积
激活函数:ReLU
池化:最大池化长*宽*步长(3*3*2)
输出:长*宽*通道(6*6*128)

代码

全连接层

Layer-6


小伙一小时敲出python深度学习框架,AlexNet-8案例分析与实现_第10张图片
第六层

输入:将特征矩阵拉成一维的List,且分为两组,(6*6*256)/2=4096
全连接层:shape = (4096,2048),两组GPU同步计算
激活函数:ReLU
备注:添加dropout
输出:节点*通道(2048*2)

TensorFlow代码实现:

(注:因为此模型的连接点太多,很容易造成冗余与过拟合问题,作者在此处使用抛出率为0.5的dropout,验证了其在深度神经网络中的效果)

Layer-7

第七层

输入:两组2048的节点参数
全连接层:shape = (2048,2048),两组GPU同步计算
激活函数:ReLU
备注:添加dropout
输出:节点*通道(2048*2)

TensorFlow代码实现:

代码

Layer-8

第八层

输入:两组2048的节点参数在通道上进行拼接,组成4096的节点参数
全连接层:shape = (4096,1000),则一GPU进行计算即可
备注:最后一层采用softmax
输出:经softmax后的答案,1000种

TensorFlow代码实现:

代码

卷尾语:

         至此,我们的经典模型AlexNet-8的分析就结束了,众所周知卷积网络与全连接网络相比最大的优势就是权值共享导致的参数量大幅度降低,但本模型的参数量依旧很庞大。虽然Paper的作者是使用的两个GPU进行运算的,但是我们完全可以用TensorFlow或Keras进行一个GPU甚至CPU进行模拟,当然CPU的速度要慢的很多。

         AlexNet现在大多都做为教学上的一种经典案例,辉煌的时代基本上已经过去了。不过,我们现在仍会在VGG等仍在使用的模型中看到他的影子,可以说留给后人的影响是非常巨大的。

         最后,欢迎大家在下方评论中提出一些改进性的意见或者建议,我会逐渐的完善自己的写作风格,尽量让大家都能看懂,都能学会,都能说出一句:这小子写的还蛮不赖的!

(未完待续)

你可能感兴趣的:(小伙一小时敲出python深度学习框架,AlexNet-8案例分析与实现)