【经典卷积神经网络】之AlexNet分析及实现牛津花卉数据集分类

【经典卷积神经网络】之AlexNet分析及实现牛津花卉数据集分类

一、内容

2012年,深度学习三巨头之一、具有神经网络之父之称的 Geoffrey Hinton 的学生 Alex Krizhevsky 率先提出了 AlexNet,并在当年度的 ILSVRC(ImageNet大规模视觉挑战赛)以显著的优势获得当届冠军,top-5 的错误率降至了 16.4%,相比于第二名 26.2% 的错误率有了极大的提升。

论文地址
https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf

AlexNet 的创新点在于
1)首次成功使用 relu 作为激活函数,使其在较深的网络上效果超过传统的 sigmoid 激活函数,极大的缓解了梯度消失问题。
2)首次在实践中发挥了 dropout 的作用,为全连接层添加 dropout 防止过拟合。
3)相较于之前 Le-Net5 中采用的平均池化,AlexNet 首次采用了重叠的最大池化,避免了平均池化的模糊化效果。
4)提出了 LRN 层,对局部神经元的活动创建了竞争机制。
5)使用多 GPU 进行并行计算。采用了一定的数据增强手段,一定程度上也缓解了过拟合。
在这里插入图片描述
AlexNet 不算池化层总共有 8 层,前 5 层为卷积层,其中第一、第二和第五层卷积都包含了一个最大池化层,后三层为全连接层。所以 AlexNet 的简略结构如下:
输入>卷积>池化>卷积>池化>卷积>卷积>卷积>池化>全连接>全连接>全连接>输出各层的结构和参数如下:
C1层是个卷积层,其输入输出结构如下:
输入: 227 x 227 x 3 滤波器大小: 11 x 11 x 3 滤波器个数:96
输出: 55 x 55 x 96
P1层是C1后面的池化层,其输入输出结构如下:
输入: 55 x 55 x 96 滤波器大小: 3 x 3 滤波器个数:96
输出: 27 x 27 x 96
C2层是个卷积层,其输入输出结构如下:
输入: 27 x 27 x 96 滤波器大小: 5 x 5 x 96 滤波器个数:256
输出: 27 x 27 x 256
P2层是C2后面的池化层,其输入输出结构如下:
输入: 27 x 27 x 256 滤波器大小: 3 x 3 滤波器个数:256
输出: 13 x 13 x 256
C3层是个卷积层,其输入输出结构如下:
输入: 13 x 13 x 256 滤波器大小: 3 x 3 x 256 滤波器个数:384
输出: 13 x 13 x 384
C4层是个卷积层,其输入输出结构如下:
输入: 13 x 13 x 384 滤波器大小: 3 x 3 x 384 滤波器个数:384
输出: 13 x 13 x 384
C5层是个卷积层,其输入输出结构如下:
输入: 13 x 13 x 384 滤波器大小: 3 x 3 x 384 滤波器个数:256
输出: 13 x 13 x 256
P5层是C5后面的池化层,其输入输出结构如下:
输入: 13 x 13 x 256 滤波器大小: 3 x 3 滤波器个数:256
输出: 6 x 6 x 256
F6层是个全连接层,其输入输出结构如下:
输入:6 x 6 x 256
输出:4096
F7层是个全连接层,其输入输出结构如下:
输入:4096
输出:4096
F8层也是个全连接层,即输出层,其输入输出结构如下:
输入:4096
输出:1000

二、代码

# 导包
import keras
from keras.models import Sequential
from keras.layers import Dense,Activation,Dropout,Flatten,Conv2D,MaxPool2D
from keras.layers.normalization import BatchNormalization
import numpy as np
import tflearn.datasets.oxflower17 as oxflower17
np.random.seed(1000)

# 获取数据
x,y = oxflower17.load_data(one_hot=True)

# 定义AlexNet模型
model = Sequential()
# 1block
model.add(Conv2D(filters=97,kernel_size=(11,11),strides=(4,4),padding="valid",input_shape=(224,224,3)))
model.add(Activation("relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2),padding="valid"))
model.add(BatchNormalization())
# 2block
model.add(Conv2D(filters=256,kernel_size=(11,11),strides=(1,1),padding="valid"))
model.add(Activation("relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2),padding="valid"))
model.add(BatchNormalization())
# 3 block
model.add(Conv2D(filters=384,kernel_size=(3,3),strides=(1,1),padding="valid"))
model.add(Activation("relu"))
model.add(BatchNormalization())
# 4 block
model.add(Conv2D(filters=384,kernel_size=(3,3),strides=(1,1),padding="valid"))
model.add(Activation("relu"))
model.add(BatchNormalization())
# 5 block
model.add(Conv2D(filters=256,kernel_size=(3,3),strides=(1,1),padding="valid"))
model.add(Activation("relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2),padding="valid"))
model.add(BatchNormalization())
# 6 dense
model.add(Flatten())
model.add(Dense(4096, input_shape=(224*224*3,)))
model.add(Activation("relu"))
model.add(Dropout(0.4))
model.add(BatchNormalization())
# 7 dense
model.add(Dense(4096))
model.add(Activation("relu"))
model.add(Dropout(0.4))
model.add(BatchNormalization())
# 8 dense
model.add(Dense(17))
model.add(Activation("softmax"))

model.summary()
# compile
model.compile(loss="categorical_crossentropy",optimizer="adam",metrics=["accuracy"])
# train
model.fit(x,y,batch_size=32,epochs=8,verbose=1,validation_split=0.3,shuffle=True)

三、结果

1.模型结构

在这里插入图片描述

2.训练集、验证集

在这里插入图片描述

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类花卉数据集分类
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值