AlexNet

# 网络架构(图截原文

  • 在两个GPU上跑 
  • 卷积层 C2、C4、C5中的卷积核只和位于同一GPU的上一层的FeatureMap相连,C3的卷积核与两个GPU的上一层的FeautureMap都连接

网络架构讲解的很清楚:卷积神经网络经典回顾之AlexNet - 知乎 (zhihu.com)

手撕 CNN 经典网络之 AlexNet(理论篇) - 知乎 (zhihu.com) 这篇讲的更好,以下所有📒都是摘自这个🔗

第一层讲解 C1

这一层要做:

conv→ReLU→LRN→Pooling

输入 :  227*227*3

操作:

卷积96@11*11*3  padding=0  stride=4

计算输出:(227-11+2*0+4)/4 = 55

        输出:55*55*96

(ReLu)卷积层输出的特征图输入到ReLu函数

(LRN)

  • 对局部神经元创建竞争机制,s.t.响应比较大的值变得相对更大,并抑制其他反馈比较小的神经元,增强模型的泛化能力
  • LRN的输出:55*55*96(输出不变)
  • 输出分为2组,每组大小:55*55*48,分别位于单个GPU上

(池化)

  • 输入:55*55*96(分为两组:55*55*48
  • 使用3*3,stride=2的池化单元
  • (重叠池化)stride<pooling_size
  • 根据公式计算输出

(55-3+2*0+2)/2=27

27*27*96(输出两组:27*27*48)

小结论吧:pool_size=3 stride=2 的池化层,池化以后输出尺寸的长宽各减少一半     

第二层讲解 C2

该层的处理流程是:卷积-->ReLU-->局部响应归一化(LRN)-->池化

我的理解是,图中只画出了一次卷积之后的输出结果。

卷积:两组输入均是27x27x48,各组分别使用128个5x5x48的卷积核进行卷积,padding=2,stride=1,根据公式:(input_size + 2 * padding - kernel_size) / stride + 1=(27+2*2-5)/1+1=27,得到每组输出是27x27x128

ReLU:将卷积层输出的FeatureMap输入到ReLU函数中。

局部响应归一化:使用参数k=2,n=5,α=0.0001,β=0.75进行归一化。每组输出仍然是27x27x128。

池化:使用3x3,stride=2的池化单元进行最大池化操作(max pooling)。注意这里使用的是重叠池化,即stride小于池化单元的边长。根据公式:(27+2*0-3)/2+1=13,每组得到的输出为13x13x128

它这边的池化也好理解,pool_size=3,stride=2,padding=0,输出的图像,高宽各减少一半,通道数不变。所以只画出了卷积的结果,也算情有可原。

第三层 C3

该层的处理流程是: 卷积-->ReLU

卷积输入是13x13x256,使用384个3x3x256的卷积核进行卷积,padding=1,stride=1,根据公式:(input_size + 2 * padding - kernel_size) / stride + 1=(13+2*1-3)/1+1=13,得到输出是13x13x384

ReLU:将卷积层输出的FeatureMap输入到ReLU函数中。将输出其分成两组,每组FeatureMap大小是13x13x192,分别位于单个GPU上。

(我脑子累了,只能粘贴粘贴📒了,没办法画了)

第四层 C4

该层的处理流程是:卷积-->ReLU

卷积两组输入均是13x13x192各组分别使用192个3x3x192的卷积核进行卷积,padding=1,stride=1,根据公式:(input_size + 2 * padding - kernel_size) / stride + 1=(13+2*1-3)/1+1=13,得到每组FeatureMap输出是13x13x192。(分析的是一个组的情况)

ReLU:将卷积层输出的FeatureMap输入到ReLU函数中。

第五层 C5

该层的处理流程是:卷积-->ReLU-->池化

卷积两组输入均是13x13x192各组分别使用128个3x3x192的卷积核进行卷积padding=1stride=1,根据公式:(input_size + 2 * padding - kernel_size) / stride + 1=(13+2*1-3)/1+1=13,得到每组FeatureMap输出是13x13x128。(用单个组的说)

ReLU:将卷积层输出的FeatureMap输入到ReLU函数中。

池化:使用3x3,stride=2的池化单元进行最大池化操作(max pooling)。注意这里使用的是重叠池化,即stride小于池化单元的边长。根据公式:(13+2*0-3)/2+1=6,每组得到的输出为6x6x128

(都在描述单个组,蒽,清清楚楚了)

(然后这边,pool_size=3,stride=2  池化之后的窗口 减半)

第六层 FC6

该层的流程为:(卷积)全连接 -->ReLU -->Dropout (卷积)

全连接输入为6×6×256(这里的输入是因为C5→FC6 两个GPU交互了 所以把第三维合并作为输入),使用4096个6×6×256的卷积核(注意这里的卷积核大小与输入图像完全相同 所以1个卷积核输出1个值)进行卷积,由于卷积核尺寸与输入的尺寸完全相同,即卷积核中的每个系数只与输入尺寸的一个像素值相乘一一对应,根据公式:(input_size + 2 * padding - kernel_size) / stride + 1=(6+2*0-6)/1+1=1,得到输出是1x1x4096既有4096个神经元,该层被称为全连接层(6!)

ReLU:这4096个神经元的运算结果通过ReLU激活函数中。

Dropout:随机的断开全连接层某些神经元的连接,通过不激活某些神经元的方式防止过拟合。4096个神经元也被均分到两块GPU上进行运算。

第七层 FC7

该层的流程为:(卷积)全连接 -->ReLU -->Dropout

全连接:输入为4096个神经元,输出也是4096个神经元(作者设定的)。

ReLU:这4096个神经元的运算结果通过ReLU激活函数中。

Dropout:随机的断开全连接层某些神经元的连接,通过不激活某些神经元的方式防止过拟合。

4096个神经元也被均分到两块GPU上进行运算。

(这些层的流程设计 还真是需要扒论文 谢谢这个博主)

第八层 输出层

该层的流程为:(卷积)全连接 -->Softmax

全连接:输入为4096个神经元,输出是1000个神经元。这1000个神经元即对应1000个检测类别。

Softmax:这1000个神经元的运算结果通过Softmax函数中,输出1000个类别对应的预测概率值。

FLOPS 不看 (看不懂

是谁、在哪儿、啥时候

AlexNet是由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton在2012年ImageNet图像分类竞赛中提出的一种经典的卷积神经网络。

AlexNet的作者是多伦多大学的Alex Krizhevsky等人。Alex Krizhevsky是Hinton的学生。网上流行说 Hinton、LeCun和Bengio是神经网络领域三巨头,LeCun就是LeNet5的作者(Yann LeCun)。

鉴于当时的硬件资源限制,由于AlexNet结构复杂、参数很庞大,难以在单个GPU上进行训练。因此AlexNet采用两路GTX 580 3GB GPU并行训练。也就是说把原先的卷积层平分成两部分FeatureMap分别在两块GPU上进行训练(例如卷积层55x55x96分成两个FeatureMap:55x55x48)

创新点:

  1. 激活函数ReLU
  2. 局部响应归一化
  3. Dropout
  4. 重叠池化
  5. 双GPU
  6. 端到端的训练

©手撕 CNN 经典网络之 AlexNet(理论篇) - 知乎 (zhihu.com)

原文:

ImageNet Classification with Deep Convolutional Neural Networks (neurips.cc)

  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AlexNet是由Alex Krizhevsky等人在2012年提出的一个深度卷积神经网络(Convolutional Neural Network,CNN),它在ImageNet图像识别挑战赛中取得了显著突破,首次击败了传统的计算机视觉方法。这标志着深度学习在计算机视觉领域的重大进展。 在TensorFlow框架中,AlexNet可以被用来作为预训练模型,用于迁移学习任务,即在一个大型数据集(如ImageNet)上训练好的模型,在新的、具有相似任务的小规模数据集上进行微调。TensorFlow库提供了方便的接口,如`tf.keras.applications.AlexNet()`,可以直接加载预训练的AlexNet模型,并允许用户进行前向传播或对某些层进行修改和训练。 以下是使用AlexNet的基本步骤: 1. **导入模型**: ```python from tensorflow.keras.applications import AlexNet model = AlexNet(weights='imagenet') # 加载预训练权重 ``` 2. **冻结层**(如果不需要训练整个网络): ```python for layer in model.layers[:-10]: # 冻结除最后几层之外的层 layer.trainable = False ``` 3. **添加新层**(如果需要自定义输出): ```python new_output_layer = tf.keras.layers.Dense(units=...)(model.output) model = tf.keras.Model(inputs=model.input, outputs=new_output_layer) ``` 4. **编译和训练**(替换为新数据集): ```python model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=..., validation_data=(x_val, y_val)) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值