从代码学习深度学习 - 含并行连结的网络(GoogLeNet)PyTorch版
文章目录
- 前言
- 一、GoogLeNet的理论基础
- 1.1 背景与创新点
- 1.2. Inception模块的工作原理
- 二、完整代码实现与解析
- 2.1. 环境准备与工具函数
- 2.2. 数据加载 - Fashion-MNIST
- 2.3. Inception模块设计
- 2.4. GoogLeNet完整模型
- 2.5. 训练函数
- 2.6. 运行训练
- 三、训练结果与分析
- 3.1. 性能分析
- 3.2. 可视化结果
- 3.3. 模型局限性
- 四、扩展与改进建议
- 总结
前言
深度学习近年来在计算机视觉、自然语言处理等领域取得了巨大成功,而卷积神经网络(CNN)作为其核心支柱之一,推动了许多突破性应用。GoogLeNet(Inception v1)是2014年ImageNet挑战赛(ILSVRC)的冠军模型,以其创新的Inception模块和高效设计脱颖而出。它不仅在性能上超越了当时的经典模型(如AlexNet和VGG),还在参数量和计算复杂度上实现了优化。
本文将通过PyTorch实现一个简化的GoogLeNet版本,并结合完整的代码和详细解析,帮助读者从实践中掌握深度学习的核心概念。我们将从GoogLeNet的理论基础讲起,逐步剖析代码实现,最后在Fashion-MNIST数据集上进行训练和结果分析。这不仅是一次从理论到实践的学习之旅,也是一个理解现代CNN设计思想的机会。
一、GoogLeNet的理论基础
1.1 背景与创新点
在GoogLeNet之前,CNN模型(如AlexNet、VGG)倾向于通过加深网络层数或增加卷积核大小来提升性能,但这往往导致参数量激增和计算资源浪费。GoogLeNet提出了一个全新的思路:通过多尺度特征提取和计算效率优化来提升性能。其核心创新是Inception模块,它通过并行使用不同大小的卷积核(1x1、3x3、5x5)和池化操作,在单一层内捕获多种尺度的特征。
此外,GoogLeNet引入了以下关键技术:
- 1x1卷积:用于降维,减少通道数,从而降低计算量。
- 全局平均池化:替换传统全连接层,减少参数量并增强泛化能力。
- 辅助分类器:在网络中间添加分支,增强梯度传播,缓解深层网络训练中的梯度消失问题。
原始GoogLeNet有22层,但参数量仅为VGG-19的1/12,展现了其高效性。在本文中,我们将实现一个简化版,如下图所示,专注于Inception模块,并省略辅助分类器,以适应Fashion-MNIST数据集的较小规模。
1.2. Inception模块的工作原理
Inception模块的核心思想是“多路径并行”,如下图所示。它通过以下四条路径提取特征:
- 1x1卷积:直接提取局部特征,降低计算成本。
- 1x1卷积 + 3x3卷积:先降维再进行中等尺度卷积。
- 1x1卷积 + 5x5卷积:先降维再捕获更大范围特征。
- 3x3最大池化 + 1x1卷积:保留空间信息并调整通道数。
这些路径的输出最后沿通道维度拼接,形成一个更丰富的特征表示。这种设计既增加了网络宽度(width),又避免了单纯加深网络带来的过拟合风险。
二、完整代码实现与解析
以下是完整的PyTorch代码实现,包括所有工具函数、数据加载、模型定义和训练逻辑。
2.1. 环境准备与工具函数
我们首先定义一些工具类,用于计时、累加指标和计算准确率。这些工具在深度学习实验中非常实用。
import time
import torch
import torch.nn as nn
import numpy as np
import torchvision
import torchvision.transforms as transforms
from torch.utils import data
import multiprocessingclass Timer:"""记录多次运行时间"""def __init__(self):self.times = []self.start()def start(self):self.tik = time.time()def stop(self):self.times.append(time.time() - self.tik)return self.times[-1]def avg(self):return sum(self.times) / len(self.times)def sum(self):return sum(self.times)def cumsum(self):return np.array(self.times).cumsum().tolist()class Accumulator:"""在 n 个变量上累加"""def __init__(self, n):self.data = [0.0] * ndef add(self, *args):self.data = [a + float(b) for a, b in zip(self.data, args)]def reset(self):self.data = [0.0] * len(self.data)def __getitem__(self, idx):return self.data[idx]def accuracy(y_hat, y):"""计算预测正确的数量"""if len(y_hat.shape) > 1 and y_hat.shape[1] > 1:y_hat = y_hat.argmax(axis=1)cmp = y_hat.to(y.dtype) == yreturn float(cmp.to(y.dtype).sum())def evaluate_accuracy_gpu(net, data_iter, device=None):"""使用GPU计算模型在数据集上的精度"""if isinstance(net, nn.Module):net.eval()if not device:device = next(iter(net.parameters())).devicemetric = Accumulator(2)with torch.no_grad():for X, y in data_iter:X, y = X.to(device), y.to(device)metric.add(accuracy(net(X), y), y.numel())
相关文章:
从代码学习深度学习 - 含并行连结的网络(GoogLeNet)PyTorch版
文章目录 前言一、GoogLeNet的理论基础1.1 背景与创新点1.2. Inception模块的工作原理二、完整代码实现与解析2.1. 环境准备与工具函数2.2. 数据加载 - Fashion-MNIST2.3. Inception模块设计2.4. GoogLeNet完整模型2.5. 训练函数2.6. 运行训练三、训练结果与分析3.1. 性能分析3…...
进程Kill杀死后GPU显存没有释放仍然被占用,怎么杀死僵尸进程
参考链接: https://blog.csdn.net/qq_37591986/article/details/131118109 使用下面的命令: fuser -v /dev/nvidia0 | awk {print $0} | xargs kill -9一般来说他会杀掉整个用户的所有进程。...
Deepseek API+Python 测试用例一键生成与导出 V1.0.3
** 功能详解** 随着软件测试复杂度的不断提升,测试工程师需要更高效的方法来设计高覆盖率的测试用例。Deepseek API+Python 测试用例生成工具在 V1.0.3 版本中,新增了多个功能点,优化了提示词模板,并增强了对文档和接口测试用例的支持,极大提升了测试用例设计的智能化和易…...
【字符设备驱动开发–IMX6ULL】(一)简介
【字符设备驱动开发–IMX6ULL】(一)简介 一、Linux驱动与裸机开发区别 1.裸机驱动开发回顾 1、底层,跟寄存器打交道,有些MCU提供了库。 spi.c:主机驱动(换成任何一个设备之后只需要调用此文件里面的…...
MaxKB 如何通过Nginx修改浮框提示文字
在使用MaxKB做第三方嵌入的时候,总会有想Diy前端样式的场景,下面就通过Nginx的方式,实现浮框样式的改变。 一、效果对比 修改前: 修改后: 前后对比: 修改了提示文字。去掉了图标后面的白框 下面讲一下该…...
中小型企业网络的搭建
1.1 网络逻辑拓扑、布线方案的设计 1.1.1 网络设计依据 网络设计应遵循以下基本原则: 高效性:确保网络架构能够支持企业日常业务的高效运行。 可靠性:采用冗余设计,确保网络的高可用性,避免单点故障。 可扩展性…...
第二卷:海盐城血战(37-72回)正反人物群像
第二卷:海盐城血战(37-72回)正反人物群像 核心矛盾:寒门军事崛起 → 内部倾轧 → 制度性腐败 主题:通过人物群像展现寒门胜利的虚幻性与权力异化的必然性 一、正派阵营(寒门抗争势力) 1. 刘裕…...
qt之使用redis与其他程序(python)交互同通信
一、前言 有需求,趁热调试出了嵌入式系统的算法环境安装和远程桌面以及一些其他的之前一直未调试出搁置的功能,趁热继续调试进阶功能redis通信,redis与sqlite各有千秋,redis可以作为在嵌入式系统下多个程序之间相互通信的中间件&…...
Pycharm(七):几个简单案例
一.剪刀石头布 需求:和电脑玩剪刀石头布游戏 考察点:1.随机数;2.判断语句 import random # numrandom.randint(1,3) # print(num) # print(**30) #1.录入玩家手势 playerint(input(请输入手势:(1.剪刀 2.石头 3&…...
05.AI搭建preparationの(transformers01)BertTokenizer实现分词编码
一、下载 bert-base-chinese镜像下载 二、简介作用: 模型每个参数占用的字节大小模型大小模型大小层数头数GPT-14 个字节的 FP32 精度浮点数117M446MB1212GPT-22 个字节的 FP161.5亿到1.75亿0.5GB到1.5GB4816GPT-32 个字节的 FP161.75万亿(17500亿&a…...
Perl 环境安装指南
Perl 环境安装指南 引言 Perl是一种广泛使用的解释型、动态编程语言,以其强大的文本处理能力和灵活性著称。本文将为您详细介绍Perl环境的安装过程,包括系统要求、安装步骤以及注意事项。 系统要求 在安装Perl之前,请确保您的计算机满足以下基本要求: 操作系统:Window…...
Visual Studio中创建和配置设置文件(Settings.settings) - 详细步骤指南——待调试
#在Visual Studio中创建和配置设置文件(Settings.settings) - 详细步骤指南 在Visual Studio中创建和配置应用程序设置文件,用于保存用户上次输入的值。 第一步:添加设置文件 1. **打开你的项目**:在Visual Studio中打开你的AutoCAD插件项目 …...
Nginx的时钟精度陷阱:request_time与upstream_response_time差异分析
在elasticsearch 采集nginx日志分析的场景下发现, request_time 小于upstream_response_time ,于是才有了这边文章。 在 Nginx 中,upstream_response_time 和 request_time 使用不同的系统时钟和精度机制来记录时间,这可能导致 u…...
参加李继刚线下活动启发:未来提示词还会存在吗?
上周六,我参加了李继刚老师组织的线下活动。 现场干货满满,尤其是关于 AI 时代提示词的价值、与 AI 沟通的艺术等话题,李老师的分享如同醍醐灌顶,让我对 AI 人机协作有了更深的理解。 将几点核心收获整理出来,与大家…...
C++作用域辨识详解
在 C 中,作用域(Scope)定义了变量、函数、类等标识符的可见性和生命周期。理解作用域对于编写清晰、高效的代码至关重要。以下是 C 中作用域的详细分类和说明。 1. 全局作用域(Global Scope) 全局作用域是指在所有函…...
MYTOOL-记事本
一、前言 目录 1.原型设计 2.程序实现 3.最终界面说明 二、环境 windows10 每个软件工具前期会设计大概的原型,我设计的原型工具使用Axure RP9,很不错的一个设计工具 三、正文 1.原型设计 2.程序实现 3.最终界面说明 四、结语...
混合知识表示系统框架python示例
前文我们已经深入学习了框架表示法、产生式规则和一阶谓词逻辑,并对它们进行了深度对比,发现它们在不同的应用场景下各有优缺点。 一阶谓词逻辑适合复杂逻辑推理场景,具有数学定理证明、形式化系统规范的优点;产生式规则适合动态决策系统,支持实时决策(如风控、诊断),规…...
Vue2——常用指令总结、指令修饰符、v-model原理、computed计算属性、watch监听器、ref和$refs
文章目录 一、概念理解二、指令1. 常用内置指令总结2. 常用指令修饰符3. 自定义指令4. v-model原理表单类组件封装 三、补充1. computed计算属性2. watch监视器3. ref和$refs 一、概念理解 【事件处理函数】 事件处理函数应该写到一个跟data同级的配置项(methods&a…...
2025-3-29算法打卡
一,回文判定 1.题目描述: 题目描述 给定一个长度为 nn 的字符串 SS。请你判断字符串 SS 是否回文。 输入描述 输入仅 11 行包含一个字符串 SS。 1≤∣S∣≤1061≤∣S∣≤106,保证 SS 只包含大小写、字母。 输出描述 若字符串 SS 为回…...
【网络编程】搭建一个简单的UDP通信服务器和客户端
🦄个人主页:修修修也 🎏所属专栏:网络编程 ⚙️操作环境:VS Code (操作系统:Ubuntu 22.04 server 64bit) 目录 搭建UDP服务器 搭建UDP客户端 其余工程文件 主函数文件Main.cc 日志打印文件Log.hpp Makefile文件 结语 搭建UDP服务器 搭建UDP服务器的主要流…...
数据分析概述
数据分析:用适当的分析方法和挖掘方法对收集来的数据进行研究总结,提取有用的信息,形成结论并支持决策的过程。 一.数据分析的分类 1.业务描述性分析。以数据为分析对象,以探索数据内的有用信息为主要途径,以解决业务…...
【C#】C#字符串拼接的6种方式及其性能分析对比
C#字符串拼接的6种方式及其性能分析对比 前言BenchmarkDotNet拼接基础数据操作符$内插字符串String.FormatString.ConcatString.JoinStringBuilder性能基准对比测试完整代码少量字符串拼接大量字符串拼接 前言 在C#编程中字符串拼接是一种常见且基础的操作,广泛应用…...
图解AUTOSAR_SWS_SPIHandlerDriver
AUTOSAR SPI Handler/Driver 详解 AUTOSAR标准下的SPI通信模块详细设计与实现 目录 AUTOSAR SPI Handler/Driver 详解 目录1. AUTOSAR SPI模块概述 1.1 SPI模块的作用1.2 SPI模块在AUTOSAR中的位置1.3 SPI模块整体架构 2. SPI模块状态机 2.1 状态定义2.2 状态转换2.3 子状态机…...
华为HCIE网络工程师培训选机构攻略
从 官方授权机构 到 性价比黑马,结合价格、师资、通过率等维度,为你筛选出最适合的培训方案。 一、华为官方授权机构(优先推荐) 华为官方授权机构拥有 真机实验环境考官级讲师,适合预算充足、追求高通过率的学员。 机…...
【银河麒麟系统常识】命令:dotnet --list-sdks(列出已安装的 .NET SDK 版本)
命令: dotnet --list-sdks 功能 列出当前系统中所有已安装的 .NET SDK 版本; 返回值规则 # 1. 格式:<版本号>[<安装路径>]; # 2. 排序:按版本号从低到高排序;示例...
【数据仓库】湖仓一体的核心建模理论
湖仓一体(Lakehouse)是一种融合数据湖与数据仓库优势的新型架构,其建模理论在传统数据仓库与数据湖基础上进行了扩展和创新。以下从核心建模理论、关键技术支撑及与传统架构的差异三个维度进行解析: 一、湖仓一体的核心建模理论 …...
Go 语言规范学习(3)
文章目录 Properties of types and valuesRepresentation of valuesUnderlying types【底层类型】Core types【核心类型】Type identityAssignabilityRepresentabilityMethod sets BlocksDeclarations and scopeLabel scopesBlank identifierPredeclared identifiersExported i…...
基于django优秀少儿图书推荐网(源码+lw+部署文档+讲解),源码可白嫖!
摘要 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,图书推荐网当然不能排除在外。本次开发的优秀少儿图书推荐网是在实际应用和软件工程的开发原理之上,运用Python语言、爬虫技术…...
CS2 DEMO导入blender(慢慢更新咯)
流程:cs2-sourcefilmmaker-blender 工具:cs2tools,cs2manager,blender,blender插件sourceio,source2viewer 导入sfm 工具界面 选择这个 sourceio插件 sourceIO其中新版本导入相机路径不见了,…...
SVTAV1函数分析-svt_av1_cost_coeffs_txb
一 函数作用 函数svt_av1_cost_coefss_txb是一个与AV1视频编码相关的函数,主要用于计算变换块(Transform Block)中系数的成本(Cost)。在视频编码中,特被是在AV1编码中,计算系数的成本对于模式决策(Mode Decision)和熵编码(Entropy Coding) 等…...
【Linux加餐-验证UDP:TCP】-windows作为client访问Linux
一、验证UDP-windows作为client访问Linux UDP client样例代码 #include <iostream> #include <cstdio> #include <thread> #include <string> #include <cstdlib> #include <WinSock2.h> #include <Windows.h>#pragma warning(dis…...
qt+opengl 加载三维obj文件
1前面我们已经熟悉了opengl自定义顶点生成一个立方体,并且我们实现了立方体的旋转,光照等功能。下面我们来用opengl来加载一个obj文件。准备我们首先准备一个简单的obj文件(head.obj)。资源在本页下载 2 在obj文件里面,…...
日报日报流量分析
快捷键 CtrlK,选择需要抓包的网卡 CtrlF可以进行关键字搜索 CtrlM,标记数据包 CtrlShiftN跳到标记处 查看包有多少协议Protocol Hierarchy(协议分级) 搜了一下TCP协议,是互联网最基本的协议࿰…...
SQL:CASE WHEN使用详解
文章目录 1. 数据转换与映射2. 动态条件筛选3. 多条件分组统计4. 数据排名与分级5. 处理空值与默认值6. 动态排序 CASE WHEN 语句在 SQL 中是一个非常强大且灵活的工具,除了常规的条件判断外,还有很多巧妙的用法,以下为你详细总结:…...
在 Unreal Engine 5 中制作类似《鬼泣5》这样的游戏时,角色在空中无法落地的问题可能由多种原因引起。
系列文章目录 文章目录 系列文章目录前言一、实现步骤二、涉及到的蓝图三、如何把敌人击飞到空中 前言 在 Unreal Engine 5 中制作类似《鬼泣5》这样的游戏时,角色在空中无法落地的问题可能由多种原因引起。 一、实现步骤 角色碰撞设置 确保角色的碰撞组件&…...
mapbox进阶,添加鹰眼图控件
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️mapboxgl-minimap 鹰眼控件二、🍀添加…...
k8s污点与容忍
k8s污点与容忍 k8s污点管理常用命令effect标记值查看污点添加污点删除污点 node污点与容忍污点容忍yaml示例容忍放大基于污点的驱逐驱逐时排除指定服务 设置master调度设置master尽量不调度允许master节点调度pod恢复Master Only状态将node标记为不可调度状态(节点警戒)设置nod…...
算法刷题记录——LeetCode篇(9.1) [第801~810题]
更新时间:2025-03-29 算法题解目录汇总:算法刷题记录——题解目录汇总技术博客总目录:计算机技术系列博客——目录页 优先整理热门100及面试150,不定期持续更新,欢迎关注! 801. 使序列递增的最小交换次数…...
AOA与TOA混合定位,MATLAB例程,自适应基站数量,三维空间下的运动轨迹,滤波使用EKF
本代码实现了一个基于 到达角(AOA) 和 到达时间(TOA) 的混合定位算法,结合 扩展卡尔曼滤波(EKF) 对三维运动目标的轨迹进行滤波优化。代码通过模拟动态目标与基站网络,展示了从信号测量、定位解算到轨迹滤波的全流程,适用于城市峡谷、室内等复杂环境下的定位研究。 文…...
【vllm/瞎折腾】在内网wsl上安装vllm并尝试多节点部署(失败了)
目录 说在前面miniconda安装外网创建虚拟环境创建节点一的虚拟环境创建节点二的虚拟环境 内网配置环境配置节点一的环境配置节点二的环境 vllm多节点配置节点一(主节点)配置节点二配置 部署LLM(失败)补充:wsl2设置ulimit补充:wsl安装libcuda补充…...
Mayo Clinic Platform在人工智能医疗领域的现状及启示意义研究
一、引言 1.1 研究背景与意义 在科技飞速发展的当下,人工智能(AI)已逐渐渗透至各个行业,医疗领域作为关乎人类生命健康的重要领域,也迎来了人工智能技术带来的深刻变革。人工智能医疗,作为人工智能与医疗行业深度融合的产物,正重塑着全球医疗的格局。 从全球范围来看,…...
k8s部署教程
Kubernetes 1. 使用Kubernetes部署Web服务器 我们的目标是部署三个实例,可以让用户直接访问。三个实例,这样即便一个崩溃了,也还有两个,比较不容易出问题。实际中你要根据自己的业务来判断。也就是说,我们需要一个…...
java基础:常见类和对象
1.常见类和对象: java.lang.Object类,Java中的每个类都直接或间接地继承自Object类,如果没有明确指定一个类继承另一个类,那么它的默认父类就是Object类; 例如多态: package java_jichu;public class ja…...
了解遗传算法的Matlab程序的奥妙之处
老板突然想要了解遗传算法的Matlab程序,我们需要先理清楚他们的需求。首先,老板可能对遗传算法有一定的了解,但不太清楚如何在Matlab中具体实现。他可能是一个学生或者研究人员,需要应用到某个项目中,比如优化问题。老板可能希望得到一个结构清晰的步骤说明,以及具体的代…...
Java学习------源码解析之StringBuilder
1. 介绍 String中还有两个常用的类,StringBuffer和StringBuilder。这两个类都是专门为频繁进行拼接字符串而准备的。最先出现的是StringBuffer,之后到jdk1.5的时候才有了StringBuilder。 2. StringBuilder解析 从这张继承结构图可以看出: S…...
【漫话机器学习系列】163.方差膨胀因子(Variance Inflation Factor, VIF)
方差膨胀因子(Variance Inflation Factor, VIF)详解 1. 什么是方差膨胀因子? 方差膨胀因子(Variance Inflation Factor, VIF)是一种用于衡量回归分析中多重共线性(Multicollinearity)程度的指…...
蓝桥杯省模拟赛 字符串拼接
问题描述 给定四个字符串 a,b,c,d,请将这四个字符串按照任意顺序依次连接拼成一个字符串。 请问拼成的字符串字典序最小是多少? 输入格式 输入四行,每行包含一个字符串。 输出格式 输出一行包含一个字符串,表示答案。 样例…...
前端路由守卫与后端权限验证,仅使用路由守卫是否安全?
前后端分离架构的安全原则 后端必须对所有 API 接口进行权限验证前端仅负责用户界面的重定向安全策略应始终由后端最终决定 问题1:前端设置路由守卫是否可以阻挡用户直接通过URL访问??? 前端路由守卫(如 Vue Router …...
React-nodejs 练习 个人博客
1.主要功能模块: 文章管理:CRUD操作 用户系统:注册、登录、权限控制评论系统:文章评论功能 2.技术栈: 前端:React Ant Design React Router后端:Express MongoDB 通信:RESTful…...
AI三大主义 和 深度学习三大主义
在人工智能(AI)研究领域,"三大主义"通常指三种核心方法论或思想流派,它们代表了不同的技术路径和哲学观点。以下是主流的划分方式: 1. 符号主义(Symbolicism) 核心思想:智…...