经典网络(一) AlexNet逐层解析 | 代码、可视化、参数查看!

news2024/12/30 1:23:00

文章目录

  • 1 回顾
  • 2 AlexNet的重要性
  • 3 AlexNet解析
    • 3.1 结构
      • 3.1.1 CONV1
      • 3.1.2 Max Pool1
      • 3.1.3 NORM1
      • 3.1.4 CONV2
      • 3.1.5 Max Pool2
      • 3.1.6 CONV3 CONV4
      • 3.1.7 CONV5
      • 3.1.8 Max Pool3
      • 3.1.9 FC1 FC2 FC3
    • 3.2 AlexNet使用到的技巧
    • 3.3 可视化
    • 3.4 代码实现模拟
      • 3.4.1 查看每一层输入输出
      • 3.4.2 查看每一层参数的形状,参数量
      • 3.4.3 快捷计算总的参数量
  • 4 AlexNet的主体贡献
  • 5 AlexNet的改进ZFnet

之前我们讲到全连接神经网络对一些已经表示成向量的比较简洁的形式是有效的
深度学习修炼(二)全连接神经网络 | Softmax,交叉熵损失函数 优化AdaGrad,RMSProp等 对抗过拟合 全攻略_Qodi的博客-CSDN博客
对于复杂图像等的输入是有很大的局限的,而通过卷积网络就可以实现更好的效果

这篇文章中讲了关于卷积操作及其一些进阶的操作
深度学习修炼(三)卷积操作 | 边界填充、跨步、多输入输出通道、汇聚池化_Qodi的博客-CSDN博客

1 回顾

具体来说,在一个卷积网络中,往往有如下的多个层,他们的功能总结如下

(1)卷积层 Conv

进行特征提取

(2)激活层

非线性操作,往往跟在卷积层后

堆叠卷积层和激活层,不断提取更深的语义特征

(3)池化层 Pooling

对每一个特征响应图独立进行,降低特征响应图每个特征响应图组中每个特征相应图的宽度和高度,减少后续卷积层的参数数量,降低计算资源耗费,进而控制过拟合

一般而言,每pool一层,尺寸下降一倍

同时缩小大小,可以增大卷积核的视野,看到更大的图

(4)全连接层

对卷积网络的特征进行变化分类

2 AlexNet的重要性

今天我们开始看经典的卷积神经网络,感受这些网络的设计思想,进一步感受不同层的作用

首先从AlexNet开始

AlexNet是一种深度卷积神经网络,由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton于2012年开发,被广泛认为是深度学习在计算机视觉领域取得突破性进展的重要里程碑之一。在ImageNet大规模数据集上表现取得历史最好成绩。

证明了这种深度网络的可行性!

3 AlexNet解析

3.1 结构

在这里插入图片描述

层数统计

计算层数时仅统计卷积层与全连接层

​ 因为池化层和归一化层都是对它们前面卷积层输出的特征图进行后处理,不单独算一层

所以这个网络可以是8层 : 卷积5层+全连接3层

3.1.1 CONV1

卷积核11×11 (用96个卷积核)深度通道变为96 步幅4 填充0

问题1 输入227×227×3 大小的图像,输出特征图个数及尺寸为多少?

(227-11)/4+1=55

所以是 尺寸 55×55

个数 96

问题2 卷积核的深度是多少?

卷积核的深度是由输入通道数决定的,所以是3

问题3 这层要学的参数有多少

(11×11×3+1)× 96 =35K

+1是偏置,每个卷积都有一个偏置参数

给一张图像,输出了96个特征图,也就意味着96种响应信息

之后特征图经过ReLu激活操作,大于0保留,小于0 为0

3.1.2 Max Pool1

池化层移动窗口大小3×3 步长为2

问题1 从卷积层1输入该层后,输出特征图个数及尺寸为多少?

尺寸 (55-3)/2+1=27

通道数不变 96

问题2 该层可学习参数为多少?

学习参数为0,没有参数可以学习!因为他就是按固定的方法采样一下就好

3.1.3 NORM1

局部响应归一化层,较大的值增大,较小的值减小

后来证明这个在深层网络中帮助微小,在后面的网络中基本都去掉了 ,后面就不讲啦

3.1.4 CONV2

卷积核5×5 (用256个卷积核)深度通道变为256 步长1 填充2

问题1 输入27×27×96 大小的特征图组,输出特征图个数及尺寸为多少?

(27-5+2×2)/1+1=27

所以是 尺寸 27×27

个数 256

增加了卷积核的个数,实际增加了卷积核的描述能力

问题2 卷积核的深度是多少?

卷积核的深度是由前面输入通道数决定的,所以96

问题3 这层要学的参数有多少

(5×5×96+1)× 256 =615K

给一张图像,输出了96个特征图,也就意味着96种响应信息

之后特征图经过ReLu激活操作,大于0保留,小于0 为0

3.1.5 Max Pool2

池化层移动窗口大小3×3 步长为2 和第一个池化层一样

问题1 从卷积层2输入该层后,输出特征图个数及尺寸为多少?

尺寸 (27-3)/2+1=13

个数(通道数)不变 256

3.1.6 CONV3 CONV4

这两层都是 卷积核3×3 (用384个卷积核)深度通道变为384 步长1 填充1

问题1 从前面输入该层后,输出特征图个数及尺寸为多少?

两层的尺寸维持不变

(13-3+2×1)+1=13

个数(通道数)维持不变

384

3.1.7 CONV5

这层又把卷积核个数降下来了 卷积核3×3 (用256个卷积核)深度通道变为256 步长1 填充1

问题1 从前面输入该层后,输出特征图个数及尺寸为多少?

两层的尺寸维持不变

(13-3+2×1)+1=13

个数(通道数)降到256

256

3.1.8 Max Pool3

再经过池化层

池化层移动窗口大小3×3 步长为2 和前两个一样

问题1 从前面输入该层后,输出特征图个数及尺寸为多少?

尺寸

(13-3)/2+1=5

通道数 256

得到最终特征响应图组

6×6×256

3.1.9 FC1 FC2 FC3

特征响应图是一个矩阵,但是我们全连接神经网络需要输入一个向量

那好说,我们把矩阵展平成一个长向量 代码中就通过flatten操作实现

向量维度 6×6×256=9216

经过FC1 映射为 4096

经过FC2 映射为 4096

再经过FC3 映射为分类的类别数 如果分类类别是10类就是10,如果是1000,就是1000

在这里插入图片描述

3.2 AlexNet使用到的技巧

1 Dropout防止过拟合

2 使用加入动量的小批量梯度下降算法加速了训练过程的收敛

3 采用样本增强,增加训练样本,防止过拟合

4 验证集损失不下降的时候,手动降低10倍学习率

5 集成多个模型,进一步提高概率

​ 单独训练多个模型,每个模型给一个预测,最后把所有预测平均

3.3 可视化

AlexNet卷积层在做什么?

学习一些特征

比如第一层可视化

img

最后一层可视化

img

可以发现卷积层学到一些纹理表示,因为很多物体都是通过纹理学习到的

3.4 代码实现模拟

3.4.1 查看每一层输入输出

建立网络,模拟图片输入网络,输出每一层的图片的形状变化

import torch
from torch import nn


net=nn.Sequential(
    nn.Conv2d(kernel_size=11,in_channels=3,out_channels=96,stride=4,padding=0),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=3,stride=2),
    nn.Conv2d(kernel_size=5,in_channels=96,out_channels=256,stride=1,padding=2),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=3,stride=2),
    nn.Conv2d(kernel_size=3,in_channels=256,out_channels=384,stride=1,padding=1),
    nn.ReLU(),
    nn.Conv2d(kernel_size=3,in_channels=384,out_channels=384,stride=1,padding=1),
    nn.ReLU(),
    nn.Conv2d(kernel_size=3,in_channels=384,out_channels=256,stride=1,padding=1),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=3,stride=2),
    nn.Flatten(),
    nn.Linear(9216,4096),
    nn.Linear(4096,4096),
    nn.Linear(4096,1000)
)

x=torch.randn(1,3,227,227)#模拟一张图片 通道数3 宽 高227

for layer in net:
    x=layer(x)
    print(layer.__class__.__name__,"输出形状: \t",x.shape)
    

    

输出

Conv2d 输出形状:         torch.Size([1, 96, 55, 55])
ReLU 输出形状:   torch.Size([1, 96, 55, 55])
MaxPool2d 输出形状:      torch.Size([1, 96, 27, 27])
Conv2d 输出形状:         torch.Size([1, 256, 27, 27])
ReLU 输出形状:   torch.Size([1, 256, 27, 27])
MaxPool2d 输出形状:      torch.Size([1, 256, 13, 13])
Conv2d 输出形状:         torch.Size([1, 384, 13, 13])
ReLU 输出形状:   torch.Size([1, 384, 13, 13])
Conv2d 输出形状:         torch.Size([1, 384, 13, 13])
ReLU 输出形状:   torch.Size([1, 384, 13, 13])
Conv2d 输出形状:         torch.Size([1, 256, 13, 13])
ReLU 输出形状:   torch.Size([1, 256, 13, 13])
MaxPool2d 输出形状:      torch.Size([1, 256, 6, 6])
Flatten 输出形状:        torch.Size([1, 9216])
Linear 输出形状:         torch.Size([1, 4096])
Linear 输出形状:         torch.Size([1, 4096])
Linear 输出形状:         torch.Size([1, 1000])

3.4.2 查看每一层参数的形状,参数量

参数只有卷积层和全连接层有,所以在提取参数之前需要进行判断

#查看参数
for i in range(len(list(net.children()))):
    print(net[i])
    if isinstance(net[i],nn.Conv2d) or isinstance(net[i],nn.Linear):
        weight=net[i].weight.data.shape
        bias=net[i].bias.data.shape
        print("\t 该层权重参数形状",weight)
        print("\t 该层偏置参数形状",bias)
        num=weight.numel()+bias.numel()
        print("\t 该层参数量  ",num)

输出

Conv2d(3, 96, kernel_size=(11, 11), stride=(4, 4))
         该层权重参数形状 torch.Size([96, 3, 11, 11])
         该层偏置参数形状 torch.Size([96])
         该层参数量   34944
ReLU()
MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)
Conv2d(96, 256, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
         该层权重参数形状 torch.Size([256, 96, 5, 5])
         该层偏置参数形状 torch.Size([256])
         该层参数量   614656
ReLU()
MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)
Conv2d(256, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
         该层权重参数形状 torch.Size([384, 256, 3, 3])
         该层偏置参数形状 torch.Size([384])
         该层参数量   885120
ReLU()
Conv2d(384, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
         该层权重参数形状 torch.Size([384, 384, 3, 3])
         该层偏置参数形状 torch.Size([384])
         该层参数量   1327488
ReLU()
Conv2d(384, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
         该层权重参数形状 torch.Size([256, 384, 3, 3])
         该层偏置参数形状 torch.Size([256])
         该层参数量   884992
ReLU()
MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)
Flatten(start_dim=1, end_dim=-1)
Linear(in_features=9216, out_features=4096, bias=True)
         该层权重参数形状 torch.Size([4096, 9216])
         该层偏置参数形状 torch.Size([4096])
         该层参数量   37752832
Linear(in_features=4096, out_features=4096, bias=True)
         该层权重参数形状 torch.Size([4096, 4096])
         该层偏置参数形状 torch.Size([4096])
         该层参数量   16781312
Linear(in_features=4096, out_features=1000, bias=True)
         该层权重参数形状 torch.Size([1000, 4096])
         该层偏置参数形状 torch.Size([1000])
         该层参数量   4097000

3.4.3 快捷计算总的参数量

num=0
for parameter in net.parameters():
    num=num+parameter.numel()
print("参数量",num)

输出

参数量 62378344

4 AlexNet的主体贡献

网络结构

1 提出了一种卷积层加全连接层的卷积神经网络结构

训练部分

2 首次使用ReLu函数作为神经网络激活函数

3 首次提出Dropout正则化来控制过拟合

4 使用加入动量的小批量梯度下降算法加速了训练过程的收敛

数据处理

5 使用数据增强极大地抑制了训练过程的拟合

设备部分

6 利用了GPU的并行计算能力,加速了网络的训练与判断

5 AlexNet的改进ZFnet

1 将第一个卷积层的卷积核大小改为了7×7

卷积核越大,感受的信息越粗粒度,卷积核越小,感受的信息越细粒度

刚开始直接用粗粒度的大卷积核会导致丢失很多的细节信息,对后面分类任务有影响

2 将第二,三个卷积层的卷积步长设置为了2

希望这种特征图的分辨率慢慢的降

避免信息损失太快

3 增加了第三,四个卷积层的卷积核个数

作者发现第三四层已经开始有高层概念了

用更多个卷积核,可以学习到更多的组合特征

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1034660.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE 虚幻引擎 利用LOD,Nanite技术优化场景性能

目录 0 引言1 LOD1.1 LOD定义1.2 UE5中的LOD技术1.3 HLOD(Hierarchical Level of Detail) 2 Nanite2.1 UE5的Nanite技术2.2 Nanite介绍2.2.1 Nanite的优势2.2.2 Nanite网格体与传统静态网格体的不同2.2.3 Nanite支持的类型2.2.4 在地形中使用Nanite 0 引…

KT142C语音芯片flash型用户如何更新固件的说明_V2

目录 一、简介 2.1 让芯片进入PC模式 2.2 双击提供的exe程序即可 一、简介 正常的情况下,用户肯定是不需要更新固件的,因为芯片出厂默认就烧录了对应的程序固件,但是有客户可能需要小修小改,或者订制一下某些功能&#xff0c…

寻找环形链表的入环点

之前我们在判断一个链表是否为环, 是运用快慢指针的方法,且只能是慢指针走一步,快指针两步; 那么如何求带环链表的入环点的 思路一:数学方法(找出带环链表各个特点量的关系) 代码:…

Linux设备驱动之Camera驱动

Linux设备驱动之Camera驱动 Camera,相机,平常手机使用较多,但是手机的相机怎么进行拍照的,硬件和软件,都是如何配合拍摄到图像的,下面大家一起来了解一下。 基础知识 在介绍具体Camera框架前&#xff0c…

图像复原与重建,解决噪声的几种空间域复原方法(数字图像处理概念 P4)

文章目录 图像复原模型噪声模型只存在噪声的空间域复原 图像复原模型 噪声模型 只存在噪声的空间域复原

字节一面:你能手撕节流防抖吗?

前言 最近博主在字节面试中遇到这样一个面试题,这个问题也是前端面试的高频问题,节流防抖是前端性能优化一个很重要的手段,所以作为一个前端工程师必须要深入掌握这个知识点,博主在这给大家细细道来。 🚀 作者简介&…

01 TextRNN FastText TextCNN-04-训练要点,实验过程

TextRNN & FastText & TextCNN-03-模型总览,后 训练要点 RNN训练 得出来的y(m)(预测标签)是每一个分类的概率,比如是一个五分类,化成5个格子,每一个格子是概率&#xff0c…

java生成PDF的Util

java使用itext生成pdf-CSDN博客 接上文 支持表格绘制表格 支持表格中的文本 字体加粗、字体上色、单元格背景上色, 支持拼接文本 支持单行文本 多种背景颜色、字体上色 支持自定义水印 废话不说先上效果图 工具类代码 package com.zxw.文件.PDF.util;import …

建立一张表: 表里面有多个字段,每一个字段对应一种数据类

首先mysql -uroot -p 进入MySQL 选择一个数据库并使用 在该数据库内创建表格 create table homework_tb( id int(11) comment 编号, company_name char(6) comment 公司名称, introduce varchar(100) comment 介绍, content1 tinytext comment 内容1, co…

ad18学习笔记十一:显示和隐藏网络、铺铜

如何显示和隐藏网络? Altium Designer--如何快速查看PCB网络布线_ad原理图查看某一网络的走线_辉_0527的博客-CSDN博客 AD19(Altium Designer)如何显示和隐藏网络 如何显示和隐藏铺铜? Altium Designer 20在PCB中显示或隐藏每层铺铜-百度经验 AD打开与…

React【Context_作用、函数组件订阅Context、Fragments 、错误边界_概念 、错误边界_应用、Refs DOM】(四)

目录 Context_作用 函数组件订阅Context Fragments 错误边界_概念 错误边界_应用 Refs & DOM Context_作用 React组件中数据是通过 props 属性自上而下(由父及子)进行传递的,但是有的时候中间的一些组件可能并不需要props的值。 //A…

深度学习自学笔记一:神经网络和深度学习

神经网络是一种模拟人脑神经元之间相互连接的计算模型,它由多个节点(或称为神经元)组成,并通过调整节点之间的连接权重来学习和处理数据。深度学习则是指利用深层次的神经网络进行学习和建模的机器学习方法。 假设有一个数据集&a…

电阻的读数

常见电阻的阻值一般有色环电阻和贴片电阻 ,下面介绍两种电阻的阻值读法。 1、色标法: 技巧:四环电阻的的精度一般为银色和金色,如果一眼能可看到这两种颜色可以判断为第4环的精度读数 可见棕色为第1环,黑色第2环&…

Three.js后期处理简明教程

后期处理(Post Processing)通常是指对 2D 图像应用某种效果或滤镜。 在 THREE.js 中我们有一个包含一堆网格物体的场景。 我们将该场景渲染为 2D 图像。 通常,该图像会直接渲染到画布中并显示在浏览器中,但我们可以将其渲染到渲染…

AI写文章软件-怎么选择不同的AI写文章软件

在如今信息爆炸的时代,无论是学生、职场人士,还是创作者和企业家,写文章都是一项常见而又重要的任务。然而,随着科技的不断进步,AI写文章的软件也逐渐走进了人们的视野。 147GPT批量文章生成工具​www.147seo.com/post…

Java 基于微信小程序的学生选课系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 第一章: 简介第二章 技术栈第三章: 功能分析第四章 系统设计第五章 系统功…

Intel酷睿和AMD锐龙

Intel酷睿系列,主要分i3、i5、i7、i9 如:Intel 酷睿i5 10210U i5:品牌修饰符。 10:代次指示符。 210:sku编号。 常见后缀: G1-G7:集显等级。 U:低功耗。 H:标压版…

通俗易懂了解大语言模型LLM发展历程

1.大语言模型研究路程 NLP的发展阶段大致可以分为以下几个阶段: 词向量词嵌入embedding句向量和全文向量理解上下文超大模型与模型统一 1.1词向量 将自然语言的词使用向量表示,一般构造词语字典,然后使用one-hot表示。   例如2个单词&…

GeekRUN-7芯片跑分表

前两个字母是芯片简写,如麒麟,是QL,骁龙是XL,天玑是TJ,第一串数字是最高值,第二串是最低值,省电模式差不多这个水平。QL9K是麒麟9000,QL9S

aix360-gec

目录 分组条件期望(GroupedCE)解释程序创建虚拟环境导包加载数据集训练模型计算独立条件期望ICEplot_ice_explanation 计算分组条件期望 (GCE)plot_gce_explanation 记录一下学习过程,官方的代码在https://github.com/Trusted-AI/AIX360/tree…