AlexNet论文代码阅读
论文标题: ImageNet Classification with Deep Convolutional Neural Networks
论文链接: https://volctracer.com/w/BX18q92F
代码链接: https://github.com/dansuh17/alexnet-pytorch
内容概述
训练了一个大型的深度卷积神经网络,将ImageNet LSVRC-2010竞赛中的120万张高分辨率图像分类到1000个不同的类别中。在测试数据上取得了37.5%的top-1错误率(top-1错误率是指其正确标签不是模型认为最可能的标签的比例)和17.0%的top-5错误率(其正确标签不是模型认为最可能的五个标签中的比例)。该神经网络包含6000万个参数和65万个神经元,由五个卷积层(其中一些后面跟着最大池化层)和三个全连接层组成,最后是一个1000路softmax。为了加快训练速度,使用了非饱和神经元和卷积运算的高效GPU实现。
一、架构
1.1多GPU训练
上图的网络架构图,分布在两个GPU中,只有第3层的卷积核是从第2层的所有卷积核映射中获取输入的,其他卷积核都只从同一GPU的卷积核映射中获取输入。两个GPU学习到的卷积核表现出不同的学习效果,这是受限连接性的结果。GPU1上的核在很大程度上与颜色无关,而GPU2上的核在很大程度上与颜色相关。
1.2使用ReLu
使用非饱和非线性激活函数(ReLU)替换了饱和非线性激活函数(tanh)加快训练。下图可以看出使用ReLu比tanh快几倍。
1.3局部响应归一化
局部归一化有助于该网络泛化。
局部响应归一化层加在了第一层和第二层卷积层后,最大池化层前。
b x , y i = a x , y i / ( k + α ∑ j = m a x ( 0 , i − n / 2 ) m i n ( N − 1 , i + n / 2 ) ( a x , y j ) 2 ) β b_{x,y}^i=a_{x,y}^i/(k+α\sum_{j=max(0,i-n/2)}^{min(N-1,i+n/2)}(a_{x,y}^j)^2)^β bx,yi=ax,yi/(k+αj=max(0,i−n/2)∑min(N−1,i+n/2)(ax,yj)2)β
用 a x , y i a_{x,y}^i ax,yi表示在位置(x,y)应用核i后再应用ReLU非线性函数计算出的神经元活动。 b x , y i b_{x,y}^i bx,yi表示响应归一化活动。求和遍历再相同空间位置的n个相邻内核映射,N是该层中内核的总数。k,n,α,β是超参数,k=2,n=5,α=0.0001,β=0.75。
1.4 重叠池化
令kernel-size>stride达到重叠池化。
二、减少过拟合
2.1 数据增强
Ⅰ图像平移和水平翻转
通过从256 * 256图像中提取随机的224 * 224补丁,使训练集大小增加了2048倍—— ( 256 − 224 ) 2 ∗ 2 (256-224)^2 *2 (256−224)2∗2,测试时提取5个224 * 224的补丁(四个角补丁和中心补丁)及其水平反射(共十个补丁)来进行预测,并在网络的softmax层对十个补丁的预测进行平均。
Ⅱ 改变训练图像中的RGB通道的强度
在整个ImageNet训练集的RGB像素值集合上执行PCA。对于每个训练图像,找到其协方差矩阵的特征向量与特征值,计算 Δ I = [ p 1 , p 2 , p 3 ] [ α 1 λ 1 , α 2 λ 2 , α 3 λ 3 ] T \Delta I = [p_1,p_2,p_3][α_1λ_1,α_2λ_2,α_3λ_3]^T ΔI=[p1,p2,p3][α1λ1,α2λ2,α3λ3]T
其中 p i , λ i p_i,λ_i pi,λi是RGB像素值3x3协方差矩阵的第i个特征向量和特征值, α i α_i αi是从均值为零,标准差为0.1的高斯分布中抽取的随机变量。在每个RGB图像像素 I x y = [ I x y R , I x y G , I x y B ] I_{xy}=[I_{xy}^R,I_{xy}^G,I_{xy}^B] Ixy=[IxyR,IxyG,IxyB]中添加 Δ I \Delta I ΔI。
该方案近似地捕捉了自然图像的一个重要属性,即物体身份对光照强度和颜色的变化是不变的。
2.2 dropout丢弃法
在前两个全连接隐藏层中使用了dropout,以0.5的概率将每个隐藏神经元的输出设置为零。在测试中,使用全部神经元,但将其输出乘以0.5。dropout会减少神经元对其他特定神经元的依赖。
三、网络的细节,
使用了momentum,动量为0.9,权重衰减为0.0005,批次大小为128。
学习率为0.01,学习率在训练过程中,随学习轮次变小。每次除以10,进行了大约90次循环。
四、结果
在ILSVRC-2012竞赛中表现如下:
五、定性评估
核心代码
self.net = nn.Sequential(nn.Conv2d(in_channels=3, out_channels=96, kernel_size=11, stride=4), # (b x 96 x 55 x 55)nn.ReLU(),nn.LocalResponseNorm(size=5, alpha=0.0001, beta=0.75, k=2), # section 3.3nn.MaxPool2d(kernel_size=3, stride=2), # (b x 96 x 27 x 27)nn.Conv2d(96, 256, 5, padding=2), # (b x 256 x 27 x 27)nn.ReLU(),nn.LocalResponseNorm(size=5, alpha=0.0001, beta=0.75, k=2),nn.MaxPool2d(kernel_size=3, stride=2), # (b x 256 x 13 x 13)nn.Conv2d(256, 384, 3, padding=1), # (b x 384 x 13 x 13)nn.ReLU(),nn.Conv2d(384, 384, 3, padding=1), # (b x 384 x 13 x 13)nn.ReLU(),nn.Conv2d(384, 256, 3, padding=1), # (b x 256 x 13 x 13)nn.ReLU(),nn.MaxPool2d(kernel_size=3, stride=2), # (b x 256 x 6 x 6))# classifier is just a name for linear layersself.classifier = nn.Sequential(nn.Dropout(p=0.5, inplace=True),nn.Linear(in_features=(256 * 6 * 6), out_features=4096),nn.ReLU(),nn.Dropout(p=0.5, inplace=True),nn.Linear(in_features=4096, out_features=4096),nn.ReLU(),nn.Linear(in_features=4096, out_features=num_classes),)self.init_bias() # initialize biasdef init_bias(self):for layer in self.net:if isinstance(layer, nn.Conv2d):nn.init.normal_(layer.weight, mean=0, std=0.01)nn.init.constant_(layer.bias, 0)# original paper = 1 for Conv2d layers 2nd, 4th, and 5th conv layersnn.init.constant_(self.net[4].bias, 1)nn.init.constant_(self.net[10].bias, 1)nn.init.constant_(self.net[12].bias, 1)
相关文章:

AlexNet论文代码阅读
论文标题: ImageNet Classification with Deep Convolutional Neural Networks 论文链接: https://volctracer.com/w/BX18q92F 代码链接: https://github.com/dansuh17/alexnet-pytorch 内容概述 训练了一个大型的深度卷积神经网络…...
62.病毒在封闭空间中的传播时间|Marscode AI刷题
1.题目 问题描述 在一个封闭的房间里摆满了座位,每个座位东西向和南北向都有固定 1 米的间隔。座位上坐满了人,坐着的人可能带了口罩,也可能没有带口罩。我们已经知道房间里的某个人已经感染了病毒,病毒的传播速度是每秒钟感染距…...
Elixir语言的安全开发
Elixir语言的安全开发 引言 在当今这个互联网高度发展的时代,软件的安全性变得越来越重要。随着网络攻击的增多,软件漏洞的频繁暴露,开发者面临着前所未有的安全挑战。Elixir,作为一种现代化的函数式编程语言,以其高…...
Rust 条件语句
Rust 条件语句 在编程语言中,条件语句是进行决策和实现分支逻辑的关键。Rust 语言作为一门系统编程语言,其条件语句的使用同样至关重要。本文将详细介绍 Rust 中的条件语句,包括其基本用法、常见场景以及如何避免常见错误。 基本用法 Rust…...

小红的合数寻找
A-小红的合数寻找_牛客周赛 Round 79 题目描述 小红拿到了一个正整数 x,她希望你在 [x,2x] 区间内找到一个合数,你能帮帮她吗? 一个数为合数,当且仅当这个数是大于1的整数,并且不是质数。 输入描述 在一行上输入一…...
使用等宽等频法进行数据特征离散化
在数据分析与处理的过程中,特征离散化是一种常见的操作。通过将连续的数值型数据转换为离散类别,能够更好地处理数据,尤其是在机器学习模型中进行分类问题的建模时。离散化能够简化数据结构,减少数据噪声,并提高模型的解释性。 本文将详细介绍如何使用 pandas 库中的 cut…...

解析 Oracle 中的 ALL_SYNONYMS 和 ALL_VIEWS 视图:查找同义词与视图的基础操作
目录 前言1. ALL_SYNONYMS 视图2. ALL_VIEWS 视图3. 扩展 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 1. ALL_SYNONYMS 视图 在 Oracle 数据库中,同义词(Synonym)是对数…...
AI协助探索AI新构型的自动化创新概念
训练AI自生成输出模块化代码,生成元代码级别的AI功能单元代码,然后再由AI组织为另一个AI,实现AI开发AI的能力;用AI协助探索迭代新构型AI将会出现,并成为一种新的技术路线潮流。 有限结点,无限的连接形式&a…...
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(OLED设备层封装)
目录 OLED设备层驱动开发 如何抽象一个OLED 完成OLED的功能 初始化OLED 清空屏幕 刷新屏幕与光标设置1 刷新屏幕与光标设置2 刷新屏幕与光标设置3 绘制一个点 反色 区域化操作 区域置位 区域反色 区域更新 区域清空 测试我们的抽象 整理一下,我们应…...

【Redis】Redis 经典面试题解析:深入理解 Redis 的核心概念与应用
Redis 是一个高性能的键值存储系统,广泛应用于缓存、消息队列、排行榜等场景。在面试中,Redis 是一个高频话题,尤其是其核心概念、数据结构、持久化机制和高可用性方案。 1. Redis 是什么?它的主要特点是什么? 答案&a…...

TensorFlow 示例摄氏度到华氏度的转换(一)
TensorFlow 实现神经网络模型来进行摄氏度到华氏度的转换,可以将其作为一个回归问题来处理。我们可以通过神经网络来拟合这个简单的转换公式。 1. 数据准备与预处理 2. 构建模型 3. 编译模型 4. 训练模型 5. 评估模型 6. 模型应用与预测 7. 保存与加载模型 …...
7.DP算法
DP 在C中,动态规划(Dynamic Programming,DP)是一种通过将复杂问题分解为重叠子问题来高效求解的算法设计范式。以下是DP算法的核心要点和实现方法: 一、动态规划的核心思想 重叠子问题:问题可分解为多个重…...

Baklib构建高效协同的基于云的内容中台解决方案
内容概要 随着云计算技术的飞速发展,内容管理的方式也在不断演变。企业面临着如何在数字化转型过程中高效管理和协同处理内容的新挑战。为应对这些挑战,引入基于云的内容中台解决方案显得尤为重要。 Baklib作为创新型解决方案提供商,致力于…...
在C语言多线程环境中使用互斥量
如果有十个银行账号通过不同的十条线程同时向同一个账号转账时,如果没有很好的机制保证十个账号依次存入,那么这些转账可能出问题。我们可以通过互斥量来解决。 C标准库提供了这个互斥量,只需要引入threads.头文件。 互斥量就像是一把锁&am…...

项目练习:重写若依后端报错cannot be cast to com.xxx.model.LoginUser
文章目录 一、情景说明二、解决办法 一、情景说明 在重写若依后端服务的过程中 使用了Redis存放LoginUser对象数据 那么,有存就有取 在取值的时候,报错 二、解决办法 方法1、在TokenService中修改如下 getLoginUser 方法中:LoginUser u…...

代码随想录刷题笔记
数组 二分查找 ● 704.二分查找 tips:两种方法,左闭右开和左闭右闭,要注意区间不变性,在判断mid的值时要看mid当前是否使用过 ● 35.搜索插入位置 ● 34.在排序数组中查找元素的第一个和最后一个位置 tips:寻找左右边…...

AI智慧社区--人脸识别
前端 人脸的采集按钮: 首先对于选中未认证的居民记录,进行人脸采集 前端的按钮 <el-form-item><el-button v-has"sys:person:info" type"info" icon"el-icon-camera" :disabled"ids.length < 0" …...

对象的实例化、内存布局与访问定位
一、创建对象的方式 二、创建对象的步骤: 一、判断对象对应的类是否加载、链接、初始化: 虚拟机遇到一条new指令,首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化…...
React基础知识回顾详解
以下是React从前端面试基础到进阶的系统性学习内容,包含核心知识点和常见面试题解析: 一、React基础核心 JSX原理与本质 JSX编译过程(Babel转换)虚拟DOM工作原理面试题:React为何使用className而不是class?…...

开发第一个安卓页面
一:在java.com.example.myapplication下创建MainActivity的JAVA类 里面的代码要把xml的页面名字引入 二:如果没有这两个,可以手动创建layout文件夹和activity_main.xml activity_main.xml使用来做页面的。 三、找到这个文件 把你的JAVA类引入…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...