动手学习深度学习-跟李沐学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节,略

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

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

相关文章

自动驾驶学习笔记(十六)——目标跟踪

#Apollo开发者# 学习课程的传送门如下,当您也准备学习自动驾驶时,可以和我一同前往: 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo 社区开发者圆桌会》免费报名—>传送门 文章目录 前言 匹配关联 轨迹记录 状态预测 总结 前…

【文件上传系列】No.2 秒传(原生前端 + Node 后端)

上一篇文章 【文件上传系列】No.1 大文件分片、进度图展示(原生前端 Node 后端 & Koa) 秒传效果展示 秒传思路 整理的思路是:根据文件的二进制内容生成 Hash 值,然后去服务器里找,如果找到了,说明已经…

【智能家居】七、人脸识别 翔云平台编程使用(编译openSSL支持libcurl的https访问、安装SSL依赖库openSSL)

一、翔云 人工智能开放平台 API文档开发示例下载 二、编译openSSL支持libcurl的https访问 安装SSL依赖库openSSL(使用工具wget)libcurl库重新配置,编译,安装运行(运行需添加动态库为环境变量) 三、编程实现人脸识别 四、Base6…

12.4每日一题(备战蓝桥杯顺序结构程序设计)

12.4每日一题(备战蓝桥杯顺序结构程序设计) 题目1000: 【入门】AB Problem题目描述输入输出样例输入样例输出来源/分类 题解 1000: 【入门】AB Problem题目 2124: 计算(ab)c的值题目描述输入输出样例输入样例输出来源/分类 题解 2124: 计算(ab)c的值题目…

UML案例分析

首先需要花大约20分钟来思考解决这个问题,如果对问题不是很熟悉,也可以在完成题目之后,找相关的资料翻阅(例如看UML类图的基本情况,UML状态图的基本情况,然后结合这些信息 做一个自我评价,看这个…

matlab 最小二乘拟合空间直线(方法三)

目录 一、算法原理1、算法过程2、参考文献二、代码实现三、结果展示四、相关链接博客长期更新,GPT与爬虫自重,你也未必能爬到最新版本。 一、算法原理 1、算法过程 空间直线的点向式方程为:

poe与chatgpt那个功能更强大

在当前的人工智能领域,Poe Al Chat以其卓越的聊天能力和实用的功能,受到了大家的广泛关注和喜爱。本文好为您个绍Poe Al Chat的功能,以及我们国内用户如何进行充值订阅。Poe Al Chat是一个基于OpenAl的GPT模型开发的人工智能聊天工具。它能够…

基于Springboot的校园失物招领系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的校园失物招领系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…

uniapp如何制作一个收缩通讯录(布局篇)

html&#xff1a; <view class"search"><view class"search_padding"><u-search change"search" placeholder"请输入成员名称" v-model"keyword"></u-search></view></view> <view…

C语言有哪些预处理操作?

C语言的预处理是在编译之前对源代码进行处理的阶段&#xff0c;它主要由预处理器完成。预处理器是一个独立的程序&#xff0c;它负责对源代码进行一些文本替换和处理&#xff0c;生成经过预处理的代码。以下是C语言预处理的一些重要特性&#xff1a; 1&#xff0c;头文件包含 #…

Ansible中执行流控制

1.ansible中的迭代循环 创建目录和文件 vim createfile.yaml - name: create file playbook hosts: all tasks: - name: create file file: path: "/mnt/{{item[name]}}" state: …

Unity 自定义窗口

放在Editor文件夹下&#xff1b; #if UNITY_EDITORusing System; using UnityEditor; using UnityEngine;namespace EditorCustumTool {/// <summary>/// 自定义窗口/// </summary>public class CustomWindow : EditorWindow{public enum FlagType{Flag1 101,Fl…

【基于ESP32无线蓝牙上传电脑Excel透传数据】

【基于ESP32无线蓝牙上传电脑透传数据】 1. 引言2. 环境搭建2.1 硬件准备:2.2 软件准备:2.3. 配置Excel端口接收功能3. 测试代码4. 连接电脑和 ESP324.1 烧录程序4.2 启动蓝牙服务4.3 测试数据透传5. 总结1. 引言 随着物联网技术的发展,越来越多的设备开始支持无线通信,其…

fl studio2024官方体验版如何破解?

fl studio2024全称Fruity Loops Studio2024&#xff0c;这款软件也被人们亲切的称之为水果&#xff0c;它是一款功能强大的音乐创作编辑软件&#xff0c;拥有全功能的录音室&#xff0c;大混音盘以及先进的音乐制作工具&#xff0c;用户通过使用该软件&#xff0c;就可以轻松制…

轻量封装WebGPU渲染系统示例<43>- 材质组装流水线(MaterialPipeline)之灯光和阴影(源码)

目标: 数据化&#xff0c;模块化&#xff0c;自动化 备注: 从这个节点开始整体设计往系统规范的方向靠拢。之前的都算作是若干准备。所以会和之前的版本实现有些差异。 当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sa…

EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks(2020)

文章目录 -Abstract1. Introductiondiss former methodour method 2. Related Work3. Compound Model Scaling3.1. 问题公式化3.2. Scaling Dimensions3.3. Compound Scaling 4. EfficientNet Architecture5. Experiments6. Discussion7. Conclusion 原文链接 源代码 - 本文中…

LeNet

概念 代码 model import torch.nn as nn import torch.nn.functional as Fclass LeNet(nn.Module):def __init__(self):super(LeNet, self).__init__() # super()继承父类的构造函数self.conv1 nn.Conv2d(3, 16, 5)self.pool1 nn.MaxPool2d(2, 2)self.conv2 nn.Conv2d(16…

Bash脚本处理ogg、flac格式到mp3格式的批量转换

现在下载的许多音乐文件是flac和ogg格式的&#xff0c;QQ音乐上下载的就是这样的&#xff0c;这些文件尺寸比较大&#xff0c;在某些场合使用不便&#xff0c;比如在车机上播放还是mp3格式合适&#xff0c;音质这些在车机上播放足够了&#xff0c;要求不高。比如本人就喜欢下载…

软件接口安全设计规范

《软件项目接口安全设计规范》 1.token授权机制 2.https传输加密 3.接口调用防滥用 4.日志审计里监控 5.开发测试环境隔离&#xff0c;脱敏处理 6.数据库运维监控审计

卷王开启验证码后无法登陆问题解决

问题描述 使用 docker 部署&#xff0c;后台设置开启验证&#xff0c;重启服务器之后&#xff0c;docker重启&#xff0c;再次访问系统&#xff0c;验证码获取失败&#xff0c;导致无法进行验证&#xff0c;也就无法登陆系统。 如果不了解卷王的&#xff0c;可以去官网看下。…