AlexNet模型简介

2012年AlexNet在ImageNet竞赛中以超过第二名10.9个百分点的绝对优势一举夺冠,自此,深度学习和卷积神经网络一举成名,一直火到了今天。

模型组成

  • 输入层
  • 5个卷积层
  • 3个全链接层

从上图还可以看到网络有两个分支,这是因为当时硬件条件有限,一块GPU显存不够所以使用了两块GPU分别训练,在最后的全连接层进行特征融合得到最后的结果。

因为网络上比较流行上面这个图,但其实我个人更喜欢下面这个图,在逻辑和过程上更加清楚。

AlexNet 各层的详细描述

输入层: 输入大小为224 x 224的3通道图像,实际上会经过预处理变为227X227X3

第1层:卷积层(卷积、池化)

    使用96个大小为11 x 11 x 3的卷积核,分两组(每组48个),按步长4个像素对输入层进行卷积运算,得到两组55 x 55 x48 的卷积结果。

    对卷积结果使用ReLu激活函数,得到激活结果。

    对激活结果使用窗口为3 x 3、步长为2个像素的重叠最大池化,得到27 x 27 x 48的池化结果。

    对池化结果使用局部响应归一化操作,得到27 x 27 x 48的归一化结果。

第2层:卷积层(卷积、池化)

    使用256个大小为27 x 27 x 48的卷积核,分两组(每组128个),按步长1个像素对第2层的归一化结果进行卷积运算,得到两组27 x 27 x 128 的卷积结果。

    对卷积结果使用ReLu激活函数,得到激活结果。

    对两组 27 x 27 x 128的激活结果使用窗口为3 x 3、步长为2个像素的重叠最大池化,得到两组13 x 13 x 128的池化结果。

    对池化结果使用局部响应归一化操作,得到两组13 x 13 x128 的归一化结果。

第3层:卷积层

    使用384个大小为13 x 13 x 256的卷集核,分两组,按步长为1个像素对上一层归一化结果卷积运算,得到两组13 x 13 x 192的卷积结果。

    对卷积结果使用ReLu激活函数,得到激活结果。

第4层:卷积层

    使用384个大小为13 x 13 x 192的卷集核,分两组,按步长为1个像素对上一层的激活结果进行卷积运算,得到两组两组 13 x 13 x 192 的卷积结果。

    对卷积结果使用ReLu激活函数,得到激活结果

第5层:卷积层(卷积、池化)

    使用256个大小为13 x 13 x 192的卷积核分两组,按步长为1个像素,对上一层的激活结果卷积运算,得到两组 13 x 13 x128卷积结果。

    对卷积结果使用ReLu激活函数,得到激活结果。

    对激活结果,进行窗口为3 x 3,步长为2个像素的重叠最大池化,得到两组13 x 3 x 128的池化结果。

第6层: 全链接层

    使用4096个神经元分两组,对上一层的池化结果全链接处理。

    对全链接结果使用ReLu激活函数。

    对激活结果使用概率为0.5的dropout操作,得到dropout结果。

第7层: 全链接层

    使用4096个神经元分两组,对上一层的池化结果全链接处理。

    对全链接结果使用ReLu激活函数。

    对激活结果使用概率为0.5的dropout操作,得到dropout结果。

第8层: 输出层

    1000路的软最大输出层,用来覆盖1000类的标签分布。

AlexNet 的贡献

  • ReLU激活函数

  • Dropout

  • LRN

  • 数据增强

代码实现

from tensorflow.keras import layers, models, Model, Sequential


def AlexNet_v1(im_height=224, im_width=224, class_num=1000):
    # tensorflow中的tensor通道排序是NHWC
    # 使用函数形式构建模型,必须加上输入层
    input_image = layers.Input(shape=(im_height, im_width, 3), dtype="float32")  # output(None, 224, 224, 3)
    x = layers.ZeroPadding2D(((1, 2), (1, 2)))(input_image)                      # output(None, 227, 227, 3)
    x = layers.Conv2D(48, kernel_size=11, strides=4, activation="relu")(x)       # output(None, 55, 55, 48)
    x = layers.MaxPool2D(pool_size=3, strides=2)(x)                              # output(None, 27, 27, 48)
    x = layers.Conv2D(128, kernel_size=5, padding="same", activation="relu")(x)  # output(None, 27, 27, 128)
    x = layers.MaxPool2D(pool_size=3, strides=2)(x)                              # output(None, 13, 13, 128)
    x = layers.Conv2D(192, kernel_size=3, padding="same", activation="relu")(x)  # output(None, 13, 13, 192)
    x = layers.Conv2D(192, kernel_size=3, padding="same", activation="relu")(x)  # output(None, 13, 13, 192)
    x = layers.Conv2D(128, kernel_size=3, padding="same", activation="relu")(x)  # output(None, 13, 13, 128)
    x = layers.MaxPool2D(pool_size=3, strides=2)(x)                              # output(None, 6, 6, 128)

    x = layers.Flatten()(x)                         # output(None, 6*6*128)
    x = layers.Dropout(0.2)(x)                      # 为下一层的Dense层加入dropout
    x = layers.Dense(2048, activation="relu")(x)    # output(None, 2048)
    x = layers.Dropout(0.2)(x)
    x = layers.Dense(2048, activation="relu")(x)    # output(None, 2048)
    x = layers.Dense(class_num)(x)                  # output(None, 5), 在这里是可以用layers.Dense(10, activation="softmax"),从而省略后面的softmax层
    predict = layers.Softmax()(x)

    model = models.Model(inputs=input_image, outputs=predict)
    return model








class AlexNet_v2(Model):
    def __init__(self, class_num=1000):
        super(AlexNet_v2, self).__init__()
        self.features = Sequential([
            layers.ZeroPadding2D(((1, 2), (1, 2))),                                 # output(None, 227, 227, 3)
            layers.Conv2D(48, kernel_size=11, strides=4, activation="relu"),        # output(None, 55, 55, 48)
            layers.MaxPool2D(pool_size=3, strides=2),                               # output(None, 27, 27, 48)
            layers.Conv2D(128, kernel_size=5, padding="same", activation="relu"),   # output(None, 27, 27, 128)
            layers.MaxPool2D(pool_size=3, strides=2),                               # output(None, 13, 13, 128)
            layers.Conv2D(192, kernel_size=3, padding="same", activation="relu"),   # output(None, 13, 13, 192)
            layers.Conv2D(192, kernel_size=3, padding="same", activation="relu"),   # output(None, 13, 13, 192)
            layers.Conv2D(128, kernel_size=3, padding="same", activation="relu"),   # output(None, 13, 13, 128)
            layers.MaxPool2D(pool_size=3, strides=2)])                              # output(None, 6, 6, 128)

        self.flatten = layers.Flatten()
        self.classifier = Sequential([
            layers.Dropout(0.2),
            layers.Dense(1024, activation="relu"),                                  # output(None, 2048)
            layers.Dropout(0.2),
            layers.Dense(128, activation="relu"),                                   # output(None, 2048)
            layers.Dense(class_num),                                                # output(None, 5)
            layers.Softmax()
        ])

    def call(self, inputs, **kwargs):
        x = self.features(inputs)
        x = self.flatten(x)
        x = self.classifier(x)
        return x

 

热门文章

暂无图片
编程学习 ·

NASM系列啊

文章目录NASM是什么?NASM下载与安装 NASM是什么?The Netwide Assembler, 一款基于80x86和x86-64平台的汇编语言编译程序, 是为了实现编译器程序跨平台和模块化的特性。 NASM支持大量的文件格式,包括Linux,*BSD,a.out,ELF,COFF,Mach−O,Microsoft 16−bit OBJ,Win32…
暂无图片
编程学习 ·

一篇文章带你搞懂 SpringBoot 的配置文件

文章目录一、SpringBoot 配置文件类型1. SpringBoot配置文件类型和作用2. application.yml配置文件3. SpringBoot配置信息的查询二、配置文件与配置类的属性映射方式1. 使用注解@Value映射2. 使用注解@ConfigurationProperties映射 一、SpringBoot 配置文件类型 1. SpringBoot配…
暂无图片
编程学习 ·

Eslint配置问题

Eslint配置问题rule规则配置解释Eslint问题解决方案 rule规则配置解释 "no-alert": 0,//禁止使用alert confirm prompt "no-array-constructor": 2,//禁止使用数组构造器 "no-bitwise": 0,//禁止使用按位运算符 "no-caller": 1,//禁止…
暂无图片
编程学习 ·

3D打印与互联网发展的探索

“互联网+3D打印+创意文化”模式崭露头角 互联网具备大众属性,3D打印技术及服务或许能结合互联网带来更多创新,通过互联网渠道带来全流程的在线、交互体验、互联网化来实时响应消费用户需求形成新的商业模式。 近日,国内一家3D打印综合性服务平台已悄然上线,为消费用户提供…
暂无图片
编程学习 ·

windows10系统-2-安装Nodejs及SocketIO

(1)双击node-v12.14.1-x64.msi CMD>npm --version查看npm的版本 CMD>npm -v (2)使用淘宝镜像的命令 CMD>npm install -g cnpm --registry=https://registry.npm.taobao.org CMD>npm list -g查看所有全局安装的模块 【全局安装所在路径C:\Users\user\AppData\Roamin…
暂无图片
编程学习 ·

记录一次已解决的异常故障

记录一次已解决的异常故障描述:centos7.5服务器,使用crontab定时调用kettle执行数据库任务。问题:定时任务完成后,数据库记录出现两条一模一样的记录,时间也一样,导致数据异常故障排除:查找crontab调用日志,查看kettle日志,均只调用一次,数据库存储过程存在两次执行记…
暂无图片
编程学习 ·

python3 yield关键字简单使用

python3 yield关键字yield简单介绍如何改变文本的样式简单实例为什么需要生成器?实例优势 yield简单介绍 yield <==> 生成器 包含yield语句的函数是一个生成器 生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值 生成器是一个不断产生值的函数 如何…
暂无图片
编程学习 ·

CentOS Liniux 使用john进行弱口令检测

什么是弱口令? 弱口令(weak password) 没有严格和准确的定义,通常认为容易被别人(他们有可能对你很了解)猜测到或被破解工具破解的口令均为弱口令。弱口令指的是仅包含简单数字和字母的口令,例如“123”、“abc”等,因为这样的口令很容易被别人破解,从而使用户的计算机面…
暂无图片
编程学习 ·

Adobe中英文转换--------2017版本之前(包括2017版本)

Adobe中英文转换--------2017版本之前(包括2017版本) 在安装根目录下 *Program Files\Adobe\Adobe After Effects CC 2017\Support Files 此文件加下找到painter.ini配置文件。在@Adobe ID之后加入一下代码,中英文转换 ForceLanguage=1 Language=en_US ForceLanguage=1 Lang…
暂无图片
编程学习 ·

数据异常解决方法汇总

文章目录Step1:积极与需求方沟通Step2:将问题进行树枝细化,直至最小单元Step 3. 基于最小单元,梳理相关因素,进行猜想验证Step 4. 测算每个因素对结果的“贡献度”碰到实在分析不出原因的数据异常怎么办? 本文转载自公众号:数据分析师成长记录 Step1:积极与需求方沟通 数…
暂无图片
编程学习 ·

手把手教你理解Volatile关键字

volatile关键字volatile 关键字是java提供的一种轻量级同步机制。他能够保证可见性和有序性,但是不能保证原子性。volatile可见性可见性表示被这个关键字所修饰的实例,在被修改后,其他的线程均可见。class MyData { // 如果没有volatile关键字的话,那我们在修改number的…
暂无图片
编程学习 ·

springboot-shiro

Shiro 根据狂神课程学习 1.1、什么是Shiro?Apache Shiro是一个强大且易用的Java安全框架 执行身份验证、授权、密码和会话管理为什么要使用shiro? 如果你是需要设计RBAC(Role Based Access Control)基础系统,需要编写大量用于权限控制的代码时。那么你需要使用Shiro。因为…
暂无图片
编程学习 ·

VsCode中自动调整格式

VsCode中使用了Prettier插件后会在保存后自动格式化样式 如果遇到不需要调整的代码时候,只要在前添加如下代码,就不会格式化 –// prettier-ignore
暂无图片
编程学习 ·

4 个好用的 Linux 监控工具

下面是 Linux 下 4 个日常使用率非常高的监控工具,可以帮助我们准确快速的诊断系统问题。 1. iotop如果你想知道某些进程使用了多少你宝贵的 I/O 资源,那么就使用 iotop 吧。 iostat 命令也是查看 I/O 状态的,但他监控的是系统级别的 I/O 情况,而 iotop 监控的是进程级别的…
暂无图片
编程学习 ·

【亥著课堂】为什么上架App Store这么困难?

AppStore模式的意义在于为第三方软件的提供者提供了方便而又高效的一个软件销售平台,成为第三方软件的提供者参与其中的积极性空前高涨,适应了手机用户们对个性化软件的需求,从而使得手机软件业开始进入了一个高速、良性发展的轨道,是苹果公司把AppStore这样的一个商业行为…
暂无图片
编程学习 ·

vue框架:变更页面background背景颜色 - 代码篇

vue框架:变更body,html页面background背景颜色场景bug介绍: vue页面切换,导致后面的页面背景颜色被上一个页面背景色覆盖,如何避免这个问题。 Method 1. 修改 style为 style scoped Method 2. 按下面的设置教程执行。1. 修改 样式:渲染前 执行 beforeCreate () {documen…
暂无图片
编程学习 ·

力扣简单题 169. 多数元素(摩尔投票法)

题目: 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [3,2,3] 输出: 3示例2: 输入: [2,2,1,1,1,2,2] 输出: 2做法分析: 对于2,2,1,3,1,…