卷首语:对于上次详谈CNN的文章,我看到很多负面评论。哎呀我滴个小心脏,不甘心的我也请了我的老友(软件工程专业)作为读者对上一篇文章进行了评判,只见他猛地将一口老白干咽下,眼神迷离的看向远方缓缓吐出一个字“懵”……
于此,我也进行了及其深刻的反思,本着写文章应对读者负责,在尽量提高质量的同时,一定一定要再降低一些门槛(门槛??在作者的键盘下是不存在的!)
本文范围:
AlexNet-8案例分析与实现
阅前须知:
本文分析方面会站在两个GPU通道的基础上进行分析讲解,代码实现采用单GPU进行模拟传播,代码中的参数并非最优,请读者适当加以思考进行改进
AlexNet:
简介:2012年ImageNet图像识别大赛冠军,可以说是许多后续DCNN模型开发的参照范例
如上图,我们可以看出该模型分为上下两组通道同时卷积处理。没错,AlexNet的作者利用两台GPU服务器对其进行模型训练。
模型分析:
上图所示,本模型的深度为八层:五层卷积,三层全连接。
可能产生误解的关键词:
通道:深度
LRN:局部相应归一化
卷积类
(在卷积类这里,因为卷积核在两个GPU通道上的工作原理基本一样,所以我会只写一个通道的例子)
Layer-1:
输入:长*宽*色深(224*224*3)
卷积:长*宽*通道*步长(11*11*96*4),这里的卷积结果被一分为二,后续将会在两个独立 的GPU上进行同步操作
激活函数:ReLU
池化:最大池化长*宽*步长(3*3*2)
备注:添加LRN
输出:长*宽*通道(27*27*96),且分为两组,每组分别为(27*27*48)
TensorFlow代码实现:
Layer-2:
输入:长*宽*通道(27*27*48)
卷积:长*宽*通道*步长(5*5*128*1),且采用全零填充,两个GPU进行同步卷积
激活函数:ReLU
池化:最大池化长*宽*步长(3*3*2)
备注:添加LRN
输出:长*宽*通道(13*13*128)
TensorFlow代码实现:
Layer-3:
输入:长*宽*通道(13*13*128)
卷积:长*宽*通道*步长(3*3*192*1),且采用全零填充,两个GPU进行同步卷积,输出结 果交叉运算
激活函数:ReLU
输出:长*宽*通道(13*13*192)
TensorFlow代码实现:
Layer-4:
输入:长*宽*通道(13*13*192)
卷积:长*宽*通道*步长(3*3*192*1),且采用全零填充,两个GPU进行同步卷积
激活函数:ReLU
输出:长*宽*通道(13*13*192)
TensorFlow代码实现:
Layer-5:
输入:长*宽*通道(13*13*192)
卷积:长*宽*通道*步长(3*3*128*1),且采用全零填充,两个GPU进行同步卷积
激活函数:ReLU
池化:最大池化长*宽*步长(3*3*2)
输出:长*宽*通道(6*6*128)
全连接层
Layer-6:
输入:将特征矩阵拉成一维的List,且分为两组,(6*6*256)/2=4096
全连接层:shape = (4096,2048),两组GPU同步计算
激活函数:ReLU
备注:添加dropout
输出:节点*通道(2048*2)
TensorFlow代码实现:
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等仍在使用的模型中看到他的影子,可以说留给后人的影响是非常巨大的。
最后,欢迎大家在下方评论中提出一些改进性的意见或者建议,我会逐渐的完善自己的写作风格,尽量让大家都能看懂,都能学会,都能说出一句:这小子写的还蛮不赖的!
(未完待续)