求推荐专门做借条的网站,用vs做购物网站,临沂专业网站建设公司,百度网址大全 官网一、深度学习硬件-CPU和GPU
芯片#xff1a;Intel or AMD
内存#xff1a;DDR4
显卡#xff1a;nVidia
芯片可以和GPU与内存通信
GPU不能和内存通信
1. CPU
能算出每一秒能运算的浮点运算数#xff08;大概0.15左右#xff09;
1.1 提升CPU利用率
1.1.1 提升缓存…一、深度学习硬件-CPU和GPU
芯片Intel or AMD
内存DDR4
显卡nVidia
芯片可以和GPU与内存通信
GPU不能和内存通信
1. CPU
能算出每一秒能运算的浮点运算数大概0.15左右
1.1 提升CPU利用率
1.1.1 提升缓存
再计算ab之前需要准备数据CPU可能计算的快但是内存很慢 主内存-L3-L2-L1-寄存器进入寄存器才能开始运算和主频一样速度最快L1访问延时0.5nsL2访问延时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
CPUAMD,ARMGPUAMD,Intel,ARM,Qualcomm
3.3 CPU/GPU高性能计算编程
CPUC或者任何高性能语言 编译器成熟 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节略