经典卷积神经网络--AlexNet的详解

2023-11-15

一.AlexNet的概述

AlexNet由Geoffrey和他的学生Alex提出,并在2012年的ILSVRC竞赛中获得了第一名。Alexnet共有8层结构,前5层为卷积层,后三层为全连接层。

AlexNet网络结构具有如下特点:

1.AlexNet在激活函数上选取了非线性非饱和的relu函数,在训练阶段梯度衰减快慢方面,relu函数比传统神经网络所选取的非线性饱和函数(如sigmoid函数,tanh函数)要快许多。

2.AlexNet在双gpu上运行,每个gpu负责一半网络的运算

3.采用局部响应归一化(LRN)。对于非饱和函数relu来说,不需要对其输入进行标准化,但Alex等人发现,在relu层加入LRN,可形成某种形式的横向抑制,从而提高网络的泛华能力。

4.池化方式采用overlapping pooling。即池化窗口的大小大于步长,使得每次池化都有重叠的部分。(ps:这种重叠的池化方式比传统无重叠的池化方式有着更好的效果,且可以避免过拟合现象的发生)

二.AlexNet网络结构

第一个卷积层

    输入的图片大小为:224*224*3,为后续处理方便,普遍改为227*227*3

    第一个卷积层为:11*11*3即卷积核尺寸为11*11,有96个卷积核,步长为4,卷积层后跟ReLU,因此输出的尺寸为 (227-11)/4+1=55,因此其输出的每个特征图 为 55*55*96,同时后面经过LRN层处理,尺寸不变.

    最大池化层,池化核大小为3*3,步长为2,输出的尺寸为 (55-3)/2+1=27,因此特征图的大小为:27*27*96。由于双gpu处理,故每组数据有27*27*48个特征图,共两组数据,分别在两个gpu中进行运算

第二层卷积层

    每组输入的数据为27*27*48,共两组数据

    每组数据都被128个卷积核大小为: 5*5*48进行卷积运算,步长为1,尺寸不会改变,同样紧跟ReLU,和LRN层进行处理.

    最大池化层,核大小为3*3,步长为2,因此输出两组特征图:13*13*128

第三层至第五层卷积层

    输入的数据为13*13*128,共两组

    第三层每组数据都被尺寸为 3*3*192的卷积核进行卷积运算,步长为1,加上ReLU,得到两组13*13*192的像素层

    第四层经过padding=1填充后,每组数据都被尺寸大小为 3*3*192的卷积核卷积运算,步长为1,加上ReLU,输出两组13*13*192的像素层

    第五层经过padding=1填充后,每组数据都被尺寸大小为 3*3*128的卷积核进行卷积运算,步长为1,加上ReLU,输出两组13*13*128的像素层

   经过3*3池化窗口,步长为2,池化后输出两组6*6*256的像素层

第六层至第八层全连接层

接下来的三层为全连接层,分别为:
6层. 4096 个神经元+ ReLU
7层. 4096个神经元 + ReLU
8层. 1000 个神经元,最后一层为softmax为1000类的概率值.

三.AlexNet的代码实现

该代码是用搭建好的AlexNet网络来实现MNIST手写体数字的识别(采用keras框架)

from keras.datasets import mnist
from matplotlib import pyplot as plt
from keras.utils import np_utils
from keras.layers import Dense,Dropout,Flatten,Conv2D,MaxPool2D,BatchNormalization
from keras.models import Sequential
from matplotlib import pyplot as plt

(X_train,Y_train),(X_test,Y_test)=mnist.load_data()
X_test1=X_test
Y_test1=Y_test
#处理图像特征
X_train=X_train.reshape(-1,28,28,1).astype("float32")/255.0
X_test=X_test.reshape(-1,28,28,1).astype("float32")/255.0
#处理标签
Y_train=np_utils.to_categorical(Y_train,10)
Y_test=np_utils.to_categorical(Y_test,10)
#print(X_train)
#print("-----------")
#print(Y_train)

#搭建AlexNet网络模型
#建立第一层卷积
model=Sequential()
model.add(Conv2D(
    filters=96,
    kernel_size=(11,11),
    strides=4,
    padding="same",
    input_shape=(28,28,1),
    activation="relu"
))

#搭建BN层
model.add(BatchNormalization())
#搭建第一层重叠最大池化层
model.add(MaxPool2D(
    pool_size=(3,3),
    strides=2,
    padding="same"
))

#建立第二层卷积
model.add(Conv2D(
    filters=256,
    kernel_size=(5,5),
    strides=1,
    padding="same",
    activation="relu"
))
#搭建BN层
model.add(BatchNormalization())
#搭建第二层池化层
model.add(MaxPool2D(
    pool_size=(3,3),
    strides=2,
    padding="same",
))

#搭建第三层卷积
model.add(Conv2D(
    filters=384,
    kernel_size=(3,3),
    strides=1,
    padding="same",
    activation="relu",
))

#搭建第四层卷积
model.add(Conv2D(
    filters=384,
    kernel_size=(3,3),
    strides=1,
    padding="same",
    activation="relu"
))

#搭建第五卷积层
model.add(Conv2D(
    filters=256,
    kernel_size=(3,3),
    strides=1,
    padding='same',
    activation="relu"
))
model.add(MaxPool2D(
    pool_size=(3,3),
    strides=2,
    padding="same"
))

#搭建第六层:全连接层
#在搭建全连接层之前,必须使用Flatten()降维
model.add(Flatten())
#全连接层
model.add(Dense(4096,activation="relu"))
model.add(Dropout(0.5))
#搭建第七层:全连接层
model.add(Dense(2048,activation="relu"))
model.add(Dropout(0.5))
#搭建第八层:全连接层即输出层
model.add(Dense(10,activation="softmax"))
model.summary()

#编译
model.compile(
    loss="categorical_crossentropy",
    optimizer="sgd",
    metrics=["accuracy"]
)

#训练
n_epoch=10
n_batch=128
training = model.fit(
    X_train,
    Y_train,
    epochs=n_epoch,
    batch_size=n_batch,
    verbose=1,
    validation_split=0.20
)

#画出准确率随着epoch的变化图
def show_train(tr,train,validation):
    plt.plot(training.history[train],linestyle="-",color="b")
    plt.plot(training.history[validation],linestyle="--",color="r")
    plt.title("trianing_history")
    plt.xlabel("epoch")
    plt.ylabel("accuracy")
    plt.legend(["train","validation"],loc="lower right")
    plt.show()
show_train(training,"accuracy","val_accuracy")
#画出误差随着epoch的变化图
def show_train(tr,train,validation):
    plt.plot(training.history[train],linestyle="-",color="b")
    plt.plot(training.history[validation],linestyle="--",color="r")
    plt.title("trianing_history")
    plt.xlabel("epoch")
    plt.ylabel("accuracy")
    plt.legend(["train","validation"],loc="upper right")
    plt.show()
show_train(training,"loss","val_loss")

#评估
test=model.evaluate(X_train,Y_train,verbose=1)
print("误差:",test[0])
print("准确率:",test[1])

#预测
def image_show(image):  #画图
    fig=plt.gcf()
    fig.set_size_inches(2,2)
    plt.imshow(image,cmap="binary")
    plt.show()
prediction=model.predict_classes(X_test)
def pre_result(i):
    image_show(X_test1[i])
    print("Y-test:",Y_test1[i])
    print("预测值:",prediction[i])
pre_result(0)
pre_result(1)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

经典卷积神经网络--AlexNet的详解 的相关文章

随机推荐

  • 解决java.net.SocketException: No buffer space available (maximum connections reach

    严重 Catalina stop java net SocketException No buffer space available maximum connections reached JVM Bindat java net Plai
  • 断网重启路由器就好_路由器间断性的无网络,重启就恢复正常,可能是这些原因导致的!...

    说到 互联网 这一个词 相信大家对它再熟悉不过了 早在互联网刚出来的时候 人们就被它那强大的 引力 给吸引过去 直到现在 互联网已成为人们可以加以利用的一种 道具 了 现如今的我们可以通过网络来了解到一些国内外最新的热点资讯 可以通过网络来
  • 局域网抓包分析工具_巧用Wireshark抓包工具,分析底层网络协议,帮助排除网络故障...

    地址解析协议 ARP Address Resolution Protocol 1 ARP头 2 数据包分析 长度 8 位 字节 MAC 地址 48 位 即 6 字节 IP 地址 32 位 即 4 字节 3 无偿的 ARP 当 IP 地址改变
  • 如何使用PT对电路进行功耗分析

    首先声明本文所讲的范围 在这篇文章中 是采用synopsys的设计流程 对数字电路进行功耗分析 生成功耗分析报告的流程 分析的对象是逻辑综合之后布局布线之前的功耗分析 以及布局布线之后的功耗分析 Synopsys做功耗分析使用到的工具是 P
  • cobra golang好用的CLI工具

    Cobra 每个好的开源项目都会有很多好用的开源库的诞生 之前学openstack的时候就对openstack的oslo系列工具组用的非常多 现在学习k8s后发现同样在go下也有很多类似的开源库 比如Cobra 就是一个用来创建命令行的 g
  • 【Qt】信号和槽对值传递参数和引用传递参数的总结

    在同一个线程中 当信号和槽都在同一个线程中时 值传递参数和引用传递参数有区别 值传递会复制对象 测试时 打印传递前后的地址不同 引用传递不会复制对象 测试时 打印传递前后的地址相同 不在同一个线程中 当信号和槽不在同一个线程中时 分两种情况
  • java生成电子发票_C#/Java 动态生成电子发票

    电子发票是电商时代的产物 PDF发票是最常见的电子发票之一 在这篇文章中 我将给大家分享一个免费的动态生成PDF电子发票的C 方案 并在文章末尾附上Java解决方案 典型的发票包含客户和供应商的名称和地址 发票编号 购买物品的描述 付款金额
  • 简单聊聊2021年Android开发的现状和思考,看看这篇文章吧!

    前言 职场的金三银四跳槽季又来了 不同的是今年比往年 冷 一些 形式更加严峻一些 大家多多少少可能都听到或看到一些信息 就是好多公司在优化裁员 作为求职者来说 面试是一道坎 很多人会恐惧面试 即使是工作很多年的老鸟 可能仍存在面试的焦虑 这
  • U盘常见问题

    1 U盘文件名乱码 一 U盘文件名显示为乱码 如下图 二 解决办法 打开命令提示符 管理员 2 U盘占有空间却不显示文件的解决方法 电脑插入U盘后 显示U盘的使用空间情况 但是打开U盘后却发现里面什么也没有 一片空白 这种情况 大多是因为文
  • 清览云题库(第四、五章)代码

    对应教材为谭浩强 C语言程序设计 清览云题库又给出了其四 五章的课外习题 目录 第四章 第4章小练习1 1 比大小 第4章小练习1 2 求平方根 第4章小练习1 3 函数求解 第4章小练习1 4 计算成绩分数所在等级 第4章小练习1 5 按
  • 讲正确很容易,讲现实就很难

    对不起 本文开启付费 老规矩 付费满200 会在知识星球免费发布 但丑话说在前面 如果因故被删帖 则不会发布在知识星球
  • c++ 空间直线与平面夹角_几何:平面几何、立体几何、解析几何

    本篇内容在知识地图中的位置 参考文本 模块三 几何学 一切源自公理和逻辑 20 几何学 为什么是数学中最古老的分支 21 公理体系 系统理论从何而来 22 非欧几何 相对论的数学基础是什么 23 解析几何 用代数方法解决更难的几何题 24
  • Obsidian Day Planner插件 甘特图不显示进度条(方框)的解决方案

    找到 obsidian plugins obsidian day planner文件夹 打开其中的main js 找到minuteInterval item next 将其中的 mm 都替换成 m 修改后代码如下 重启obsidian即可看
  • Electron详解(一):基本介绍

    文章目录 一 electron简介 二 发展历史 三 electron优缺点 四 electron和Qt的对比 五 使用electron开发的实际案例 六 electron 的原理 一 electron简介 Electron 官网 http
  • Spring Boot Actuator未授权访问漏洞利用

    目录 一 前言 二 端点描述 三 漏洞发现 四 漏洞利用 五 安全措施 六 安全建议 一 前言 Actuator 是 Spring Boot 提供的服务监控和管理中间件 当 Spring Boot 应用程序运行时 它会自动将多个端点注册到路
  • Arduino舒适的开发环境搭建:vscode+arduino插件

    Arduino舒适的开发环境搭建 vscode arduino插件 文章目录 Arduino舒适的开发环境搭建 vscode arduino插件 1 在vscode的用户配置文件settings json中加入下面这些内容 用来对ardui
  • 在 Vue 3 中安装和使用 mavon-editor富文本编辑器

    在 Vue 3 中安装和使用 mavon editor富文本编辑器 在许多网站和应用程序中 富文本编辑器是一种常见的工具 它使用户能够以直观的方式创建和编辑文本内容 本文将向您介绍如何在 Vue 3 中安装和使用 mavon editor
  • Java练习代码(五)- 线程

    package Java2021 4 8 import sun util resources ms CalendarData ms MY Create with IntelliJ IDEA Description Auther HMW Da
  • C++ qsort 排序函数

    是C中的函数 需要添加 include
  • 经典卷积神经网络--AlexNet的详解

    一 AlexNet的概述 AlexNet由Geoffrey和他的学生Alex提出 并在2012年的ILSVRC竞赛中获得了第一名 Alexnet共有8层结构 前5层为卷积层 后三层为全连接层 AlexNet网络结构具有如下特点 1 Alex