动手学习深度学习-跟李沐学AI-自学笔记(3)
一、深度学习硬件-CPU和GPU
芯片:Intel or AMD
内存:DDR4
显卡:nVidia
芯片可以和GPU与内存通信
GPU不能和内存通信
1. CPU
能算出每一秒能运算的浮点运算数(大概0.15左右)
1.1 提升CPU利用率
1.1.1 提升缓存
- 再计算a+b之前,需要准备数据(CPU可能计算的快,但是内存很慢)
- 主内存->L3->L2->L1->寄存器(进入寄存器才能开始运算,和主频一样,速度最快)
- L1访问延时:0.5ns
- L2访问延时:7ns
- 主内存访问延时:100ns
- 提升空间和时间的内存本地性(缓存效率更高)
- 时间:重用数据使得保持它们在缓存里
- 空间:按序读写数据使得可以预读取
1.1.2 提升并行
超线程:将一个CPU物理核分给两个超线程,但是对计算密集型的没用
- 高端CPU有几十个核
- 并行来利用所有核:超线程不一定提升性能,因为它们共享寄存器
例子:
2. GPU
能看到一个:xx TFLOPS(比CPU高很多)
显存会低一点点
2.1 提升GPU利用率
对于GPU来讲,一个大核包含很多小核,一个小核包含很多计算单元,一个计算单元可以开一个线程。虽然每个计算单元的计算速度可能比CPU慢,但是并行很强,总体看快。
- 并行
- 使用数千个线程(向量至少1000维)
- 内存本地性
- 缓存更小,架构更简单
- 少用控制语句
- 支持有限
- 同步开销很大
3. CPU vs GPU
本质区别:核的个数&带宽(限制峰值,每一次需要从主存里读东西),GPU的代价就是内存不能很大(太贵),控制流很弱(跳转)
3.1 CPU/GPU带宽
任务本质上还是在CPU上做的,CPU到GPU带宽不高,而且经常需要同步
因此开销很大,不要频繁在CPU核GPU之间传数据(一次传完):带宽限制,同步开销
3.2 更多的CPUs和GPUs
- CPU:AMD,ARM
- GPU:AMD,Intel,ARM,Qualcomm
3.3 CPU/GPU高性能计算编程
- CPU:C++或者任何高性能语言
- 编译器成熟
- GPU:
- Nvidia上用CUDA:编译器和驱动很成熟
- 其他用OpenCL:质量取决于硬件厂商
总结:
- CPU:可以处理通用计算,性能优化考虑数据读写效率和多线程
- GPU:使用更多的小核和更好的内存带宽,适合能大规模并行的计算任务
补充:
第31节QA
二、TPU和其他
第32节
三、单机多卡并行
第33节
四、多GPU训练实现
第34节
五、分布式训练
第35节
六、数据增广
1. 一般专注于图片
- 在已有的数据集上,增加数据多样性。
- 一般是在线生成。
- 常见:翻转(建筑物就不用反转了)、切割(在图像中切割一块(可以是随机高宽比、随机大小、随机位置),然后变形到固定形状(卷积神经网络的输入形状一般都是一样的))、颜色(改变色调、饱和度、明亮度(一般取0.5~1.5,即增加或减少50%))。
- 提供了多种数据增强方法:https://github.com/aleju/imgaug
- 从部署数据集可能有什么数据反推使用什么方法。
总结:
- 增加模型泛化性。
2. 代码实现
-
aug:图像增广的方法,有很多随机色温、色调、等等!
-
可以很多一起用:
-
scale:将图片扩大或缩小
-
就是将图像增广的方法执行多次(num_rows行num_cols列)
-
图片增广最后一般都会接一个totensor。
-
应用:
图片进行增广是一件不便宜的事,最好多开几个num_workers。
- 一般都可以防止过拟合!测试集的精度会更高~
- 训练时只有load时加上拟合函数:
补充:
- 数据足够多可以不再增广,但是泛化性不强还是得增广。一般正确增广都是有效的。
- CPU几个核决定了num_worker大小。CPU不能太弱,要不数据处理可能跟不上,起码得是8核以上。可以测试来确定。
- 异常检测,都可以进行重采样、数据增广。
- 测试一般不做数据增广。(也可以,例如图像大小,按比例保留短边切掉长边,变为想要的大小。一般只留中间的,也可以再取点别的地方的)实际应用不用,竞赛可以使用,因为预测成本增加了。
- 实验可以固定随即种子,gap一般都不会减少,总是会过拟合的。
- 因为是随机的,因此数据分布是不变的,只是多样性增加了(均值不变,方差变大了)。
- 图神经网络,训练难,但是强大。
- 增广是可以拼接图片的,但是label也需要拼接。
- 特定场景,需要针对特定场景单独采集数据,重新打标训练;也可以将不行的(分类错误)数据,重新label加入训练集再来训练。(可能叫主动学习~持续学习)
- 增广就是为了让训练集长得更像测试集。
- mix-up确实有用~具体为什么不知道(label叠加)
- torchvision和albumentation都可以
七、微调(迁移学习的一种)
- 可以说是对计算机视觉,深度学习最重要的技术。
- 首先标注一个数据集很贵!我们没有那么多的数据,想要训练好模型,可以先在大数据集上训练好,对于小数据集,简单学学就会了。
1. 网络架构
- 一个神经网络一般可以分成两块:
- 特征抽取:将原始像素变成容易线性分割的特征。
- 线性分类器:(softmax回归)来做分类。
- 微调:就是在源数据集(一般比较大)上已经训练好了一个模型,那么可以认为特征抽取那一块对于我们的目标数据集也可以使用(但是必须要和预训练好模型的是一样的架构,直接copy来权重即可),起码比随机好一点,但是线性分类器就不能直接使用了(随机初始化,反正这一层在最上面,loss直接就过来了,这样训练是比较快的)因为标号可能变了。然后根据自己的数据集稍微训练一下即可。使用在大数据集上预训练好的模型来初始化模型权重,完成精度的提升。预训练模型的质量很重要,需要在很大的模型上训练过。通常数度更快,精度更高。
2. 训练
-
是一个目标数据集上的正常训练任务,但是使用更强的正则化:
- 因为我们通常会使用更小的学习率(已经和最优解比较接近了,不需要特别长的学习率。微调对学习率不敏感,直接使用一个比较小的学习率就行了)。
- 使用更少的数据迭代(需要训练的epoch没有那么多了,训练太过很可能over fit)。
-
源数据集远复杂于目标数据(类别、数量、样本个数要百倍大于目标数据集),通常微调效果更好。没有特别优于目标数据集的不如自己从头开始训练。
3. 重用分类器权重
- 源数据集可能也有目标数据集中的部分标号。
- 这样线性分类器就可以使用预训练好的模型分类器中对应标号对应的向量(也可以重用其中的好几个类,还能再加上自己新建的类,但是只有重复的类能重用,而且只能手动提取权重。其余的无关标号的权重直接删除!)来做初始化。(实际用的不多)
- 没有的标号只能随机。
4. 固定一些层
- 神经网络通常学习有层次的特征表示:
- 低层次的特征更加通用(与底层细节相关,理解数据,我们认为这是通用的)
- 高层次的特征则更跟数据及相关(更加语义化一些,与标号更相关)
- 可以固定底部一些层的参数,不参与更新(这样模型复杂度降低),可以认为是一种更强的正则。对于数据集很小时很有用。但是怎么样最好是需要调的,最极端的是其余固定住,只训练最后一个全连接层,另一个极端就是全部的层一起动。
5. 代码实现
(训练集测试集)进行了数据增广,注意如果预训练模型做了norm,微调前也需要做同样的norm。模型输入大小要一样。要是有数据增强也是需要一样的。
-
下模型:(下载时,下列参数为true,说明不仅下模型定义下下来,还有训练好的parameter也一起拿下来)下一行代码是拿出最后一层。
-
更改输出层:并对最后一层的weight随机初始化
-
如果param_group为true:将非最后一层的参数取出,其他层lr小,fc层lr大。
-
不适用预训练:从零开始训练。
补充:
- 数据不平衡(也可以理解成标号不平衡)问题对特征提取的影响相对较小,对越往上层的影响越大,尤其是分类器。
- 要找预训练模型在和所使用的数据集相似的源数据集(可以更大,种类更多,但是要相似,当然不是源数据集必须包含目标数据集哦)上训练的,要不相差太大可能还不如从头开始训练。
- 标号要找对应的字符串(label的名称字符串,还要注意语义匹配不同,数据集上叫的名字可能不同),因为标号肯定是按照顺序来的,没什么意义。
- 微调中的归一化很重要,可以认为是网络中的一块,是可以换成batchnoralize就不需要这个了,但是我们copy时是没有copy这一块的,因此需要我们手动弄过去,但是如果预训练模型中有,那就不需要我们代码中自己搞的normalize了(源数据集的训练结构也做了归一化)。
- normalize参数是从源数据集上算出来的,finetune需要更改normalization的参数为自己数据集的均值和方差。
- auto-gluon会加入微调的(使用微调一般不会让模型变差,可能不会变好,但是一般不会变差)。
- 常用的CV预训练模型有imagenet上预训练的resnet系列。
- 微调是需要重新搞一下label和对应标号关系的,可以看课后习题有讲解。
- 自己预训练一个分类模型是有用的,因为可以用到其他图像技术上,反正都需要抽取特征的。
八、竞赛-树叶分类结果
第38节,略
九、实战-图像分类kaggle比赛
o-gluon会加入微调的(使用微调一般不会让模型变差,可能不会变好,但是一般不会变差)。
- 常用的CV预训练模型有imagenet上预训练的resnet系列。
- 微调是需要重新搞一下label和对应标号关系的,可以看课后习题有讲解。
- 自己预训练一个分类模型是有用的,因为可以用到其他图像技术上,反正都需要抽取特征的。
八、竞赛-树叶分类结果
第38节,略
九、实战-图像分类kaggle比赛
第39节40节,略
相关文章:
动手学习深度学习-跟李沐学AI-自学笔记(3)
一、深度学习硬件-CPU和GPU 芯片:Intel or AMD 内存:DDR4 显卡:nVidia 芯片可以和GPU与内存通信 GPU不能和内存通信 1. CPU 能算出每一秒能运算的浮点运算数(大概0.15左右) 1.1 提升CPU利用率 1.1.1 提升缓存…...
3.2 Puppet 和 Chef 的比较与应用
Puppet 和 Chef 的比较与应用 文章目录 Puppet 和 Chef 的比较与应用Puppet 和 Chef 简介工作原理对比**模块化的重要性**: Puppet 和 Chef 简介 介绍 Puppet 和 Chef 这两个流行的配置管理工具的背景和用途。强调它们的共同目标:实现自动化的系统配置和…...
promise使用示例
下面是一个 Promise 使用示例,通过 Promise 实现异步操作的链式调用: const getUser (userId) > {return new Promise((resolve, reject) > {// 模拟异步请求setTimeout(() > {const users [{ id: 1, name: Alice },{ id: 2, name: Bob },{ …...
一起学docker系列之十四Dockerfile微服务实践
目录 1 前言2 创建微服务模块2.1 **创建项目模块**2.2 **编写业务代码** 3 编写 Dockerfile4 构建 Docker 镜像5 运行 Docker 容器6 测试微服务7 总结8 参考地址 1 前言 微服务架构已经成为现代软件开发中的一种重要方式。而 Docker 提供了一种轻量级、便携式的容器化解决方案…...
Qt Creator 11.0.3同时使用Qt6.5和Qt5.14.2
Qt Creator 11.0.3同时使用Qt6.5和Qt5.14.2 概要方法1.打开Qt Creator中的Kit,这里我直接附上几张截图,不同的版本打开位置可能有所不同,总之最终目的是要打开构建套件(Kit)2.可以看到构建套件里面有包含了“构建套件K…...
Python中字符串列表的相互转换详解
更多资料获取 📚 个人网站:ipengtao.com 在Python编程中,经常会遇到需要将字符串列表相互转换的情况。这涉及到将逗号分隔的字符串转换为列表,或者将列表中的元素连接成一个字符串。本文将深入讨论这些情景,并提供丰富…...
09、pytest多种调用方式
官方用例 # content of myivoke.py import sys import pytestclass MyPlugin:def pytest_sessionfinish(self):print("*** test run reporting finishing")if __name__ "__main__":sys.exit(pytest.main(["-qq"],plugins[MyPlugin()]))# conte…...
分布式锁常见实现方案
分布式锁常见实现方案 基于 Redis 实现分布式锁 如何基于 Redis 实现一个最简易的分布式锁? 不论是本地锁还是分布式锁,核心都在于“互斥”。 在 Redis 中, SETNX 命令是可以帮助我们实现互斥。SETNX 即 SET if Not eXists (对应 Java 中…...
26、pytest使用allure解读
官方实例 # content of pytest_quick_start_test.py import allurepytestmark [allure.epic("My first epic"), allure.feature("Quick start feature")]allure.id(1) allure.story("Simple story") allure.title("test_allure_simple_te…...
Uncle Maker: (Time)Stamping Out The Competition in Ethereum
目录 笔记后续的研究方向摘要引言贡献攻击的简要概述 Uncle Maker: (Time)Stamping Out The Competition in Ethereum CCS 2023 笔记 本文对以太坊 1 的共识机制进行了攻击,该机制允许矿工获得比诚实同行更高的挖矿奖励。这种名为“Uncle Maker”的攻击操纵区块时间…...
浅谈可重入与线程安全
文章目录 可重入与线程安全的关系 可重入 若一个程序或子程序可以“在任意时刻被中断然后操作系统调度执行另一段代码,这段代码又使用了该副程序不会出错”,则称其为可重入(reentrant 或 re-entrant)的。即当该副程序正在运作时&…...
深入理解TDD(测试驱动开发):提升代码质量的利器
在日常的软件开发工作中,我们常常会遇到这样的问题:如何在繁忙的项目进度中,保证我们的代码质量?如何在不断的迭代更新中,避免引入新的错误?对此,有一种有效的开发方式能帮助我们解决这些问题&a…...
pyqt5使用pyqtgraph实现动态热力图
pyqt5使用pyqtgraph实现动态热力图 一、效果图 二、流程 1、打开Designer创建一个UI界面 2、把UI转成py 3、创建一个main.py文件 4、在main文件中渲染画布、创建初始数据、画热力图、创建更新数据线程、绑定按钮触发事件三、UI界面 其中h_map.py代码如下: # -*- coding: ut…...
【android开发-16】android中文件和sharedpreferences数据存储详解
1,文件读写方式的数据存储 下面是一个简单的示例,演示如何在Android中使用内部存储来保存和读取文件: 保存文件: try { String data "这是要保存的数据"; FileOutputStream fos openFileOutput("myFile"…...
《当代家庭教育》期刊论文投稿发表简介
《当代家庭教育》杂志是家庭的参谋和助手,社会的桥梁和纽带,人生的伴侣和知音,事业的良师益友。 国家新闻出版总署批准的正规省级教育类G4期刊,知网、维普期刊网收录。安排基础教育相关稿件,适用于评职称时的论文发表…...
【操作教程】如何将外省医保转入广州市区(医保转移接续手续办理)?
登录(可以用微信扫码采用粤省事账号登录,没有粤省事小程序账号的可以自主申请很方便)广东政务服务网https://www.gdzwfw.gov.cn/ 这里不得不吐槽官网开发者,太拉胯了,居然有undefined,多刷新几次就好了&…...
【分布式系统学习】CAP原理详解
CAP原理详解 前言CAP一张图 一、概念1.1 关键词解读1.2 关于CAP(拆分解读)1.3 CAP原理精髓 二、CAP模拟场景举例理解三、CAP原理证明为什么不能同时满足(下面举例说明)3.1 必须满足分区容错性P下的处理方式3.2 不是必须满足分区容…...
【聚类】K-modes和K-prototypes——适合离散数据的聚类方法
应用场景: 假设一批数据,每一个样本中,有唯一标识(id)、品类(cate_id)、受众(users, 小孩、老人、中年等)等属性,希望从其中找出一些样本,使得这…...
Python-炸弹人【附完整源码】
炸弹人 炸弹人是童年的一款经典电子游戏,玩家控制一个类似"炸弹人"的角色,这个角色可以放置炸弹,并在指定的时间内引爆它们消灭敌人以达到目标,此游戏共设有两节关卡,代码如下: 运行效果&#x…...
[英语学习][5][Word Power Made Easy]的精读与翻译优化
[序言] 今日完成第18页的阅读, 发现大量的翻译错误以及不准确. 需要分两篇文章进行讲解. [英文学习的目标] 提升自身的英语水平, 对日后编程技能的提升有很大帮助. 希望大家这次能学到东西, 同时加入我的社区讨论与交流英语相关的内容. [原著英文与翻译版对照][第18页] Wh…...
Apache Doris 详细教程(一)
1、Doris简介 1.1、doris概述 Apache Doris 由百度大数据部研发(之前叫百度 Palo,2018 年贡献到 Apache 社区后, 更名为 Doris ),在百度内部,有超过 200 个产品线在使用,部署机器超过 1000 台…...
【Vue3从入门到项目实现】RuoYi-Vue3若依框架前端学习——登录页面
若依官方的前后端分离版中,前端用的Vue2,这个有人改了Vue3的前端出来。刚好用来学习: https://gitee.com/weifengze/RuoYi-Vue3 运行前后端项目 首先运行项目 启动前端,npm install、npm run dev 启动后端,按教程配置…...
win11 关闭快速启动,解决重启后部分应用没有关闭的问题
鼠标右击win11开始菜单选择windows终端(管理员)打开输入:powercfg /h off按下回车即可...
python爬虫-某公开数据网站实例小记
注意!!!!某XX网站逆向实例仅作为学习案例,禁止其他个人以及团体做谋利用途!!! 第一步:分析页面和请求方式 此网站没有技巧的加密,仅是需要携带cookie和请求…...
还记得当初自己为什么选择计算机?
还记得当初自己为什么选择计算机? 当初你问我为什么选择计算机,我笑着回答:“因为我梦想成为神奇的码农!我想像编织魔法一样编写程序,创造出炫酷的虚拟世界!”谁知道,我刚入门的那天࿰…...
“数”说新语向未来 | GBASE南大通用2023媒体交流会成功举办
在当前国家信创战略加速实施,及国民经济数字化转型,叠加驱动信息化行业加速发展的大形势下,以“数说新语-GBASE南大通用开放创新再领航”为主题的2023 GBASE南大通用媒体交流日活动在GBASE天津总部举行。来自IT168、ITPUB、韩锋频道、自主可控…...
每天一点python——day88
#每天一点Python——88 #编程两大思想【面向过程与面向对象】 #如图: 面向过程的线性思维: 类似于做菜一步步的来,先怎么样怎么样,再怎么样 如果不一步步的来,例如先炒菜再点火,这样是做不好的 面向对象&a…...
xShell快捷键
Xshell 是一个强大的终端仿真器,它支持多种Linux发行版的远程连接。Xshell提供了一系列的快捷键,以提高用户的操作效率。以下是一些Xshell中常用的快捷键: 新建会话窗口: Ctrl N 或 Ctrl Shift N 在现有会话中打开新标签&…...
OkGo导入失败解决办法
jcenter()maven { url "https://jitpack.io" }再同步就可以了...
02、pytest环境准备
工具准备 下载Python——python官网下载:https://www.python.org/下载PyCharm——pycharm官网下载:https://www.jetbrains.com.cn/en-us/pycharm/参考文档——pytest官方文档:https://docs.pytest.org/en/7.4.x/一个方便好用的office库——p…...
专业网站开发费用/链接点击量软件
前面学习了 at 命令,此命令在指定的时间仅能执行一次任务,但在实际工作中,系统的定时任务一般是需要重复执行的。而 at 命令显然无法满足需求,这是就需要使用 crontab 命令来执行循环定时任务。在介绍 crontab 命令之前࿰…...
上海专业网站建设网站/网络推广的方式和途径有哪些
c语言并未定义任何的输入输出(IO)语句,取而代之,包含了一个全面的标准库(standard library)来提供IO机制。 本书中的很多示例都使用了iostream库。iostream库包含两个基本类型 istream 和 ostreamÿ…...
医药企业网站建设/秒收录关键词代发
C语言中内存的管理主要是依据malloc和free实现的,其中malloc主要是实现内存的分配,而free则是实现内存的释放。虽然这是我们已经很熟悉的,但是还是存在一些问题。特别是当结构体中存在指针的情况下,各种问题也就会展现出来。 其中…...
安装wordpress之后/谷歌搜索引擎下载
前提 这里做下笔记,记录下项目中遇到的问题 eslint别名设置 javascrpt开发 没有使用typescript之前,只需要在webpack或者vue.config.js设置alias即可。 // WEBPACK配置 configureWebpack{resolve: {extensions: [.js, .less, .sass, .css, .vue],alias:…...
网上外贸网站怎么做/代写文章
概述 从指定的表格中读取指定Key的列表的所有数据。 示例代码 同步调用参见章节:[List表]读取列表所有数据示例代码。 异步调用参见章节:异步调用接口示例代码。 Request对象方法说明 注:如有未列出来的Request对象方法,即表…...
wordpress divi 教程/在seo优化中
自己写的程序CPU占用率过高,无法锁定原因时,可以用VS2013帮忙检测 1. 打开VS 性能分析 2. 启动项目进行检测 3. 选择CPU采样 完成 4. 分析一段时间 然后停止分析 5. 选择显示代码 6. 阿萨德 可以查看具体函数的占用比了 原文:http://blog.csdn.n…...