Inversion of Control
Inversion of ControlConcept and PrincipleDIP、IoC、DI、SL 是什么
DIP,即依赖倒置原则(Dependency inversion principle),不是一种技术,而是一种面向对象设计思想,其使得高层次的类不依赖于低层次的类的实现细节,依赖关系被倒置(高低层次的类都反而依赖接口),从而使得低层次类依赖于高层次类的需求抽象。
IoC,即控制反转(Inversion of Control)。也是一种面向对象设计思想,是相对于DIP更进一步的解耦(连在所需类中自行创建具体的对象也不需要)。实现方式便是将用户或框架设计好的对象交给容器控制,而非传统编程过程中在其他对象内部控制,这种方式在现代的web开发、图像开发中很常用。
SL,即服务定位器(Service Locator)。是IoC的一种具体实现方法,实现了按需返回服务实例,在该模式中,服务会被提前注册到服务定位器中,并通过 ID 唯一标识。应用需要某个服务时,通过 ID 或所需类型从服务定位器中得到这个服务的实例。服务定位器解耦了服务调用者和具体的服务实现。
DI,即依赖注入( ...
Asynchronous programming
Asynchronous programmingConcept and Principle
异步编程与多线程编程
异步编程一般在单线程(或线程池)上实现并发执行,不涉及线程切换,减小了维护多线程的开销。而多线程编程在多核处理器上做并行执行,需要考虑线程间同步以及线程切换等问题
异步编程适合于I/O密集型操作,而多线程编程适合于计算密集型工作。这是因为在I/O过程中线程会被阻塞但依然要维护其占用的内存资源,并且还有进行线程切换开销;而异步编程则避免了这些问题,将I/O操作封装为异步函数,cpu在执行到I/O操作时向DMA发送指令后直接执行其他代码,当I/O操作结束后执行回调
async/await 结构
async与await被许多语言都设置为了异步编程的语法糖,有多种实现(如python中的coroutine、c#中的Task、js中的promise)。
async/await 结构可分成三部分:
调用方法:该方法调用异步方法,在异步方法执行其任务的时候继续执行该方法下其他代码
异步方法:在执行完成前立即返回调用方法,在调用方法继续执行的过程中完成任务
await 表达式:用于 ...
D2L: Object Detection
Object DetectionConcept and Principle目标检测任务与图像分类不同,目标检测要在图片中识别出多个不同的目标并表明每个目标的位置
边缘框
边缘框表示了目标的位置,有两种坐标表示法
(左上x,左上y,右下x,右下y)
(左上x,左上y,边框宽,边框高)
锚框
锚框在目标检测算法中很常用,许多目标检测算法都用到了这项技术
锚框是对边缘框的一个猜测:
提出多个被称为锚框的区域
预测每个锚框中是否含有目标物体
如果有,则继续预测从这个锚框到真实边缘框的偏移
使用交并比(IoU)来计算两个框的相似度(预测框和标签框)
赋予锚框标号
在训练时,每个锚框都是一个训练样本,每次读取一张图片都要进行一次赋予锚框标号的操作
将每个锚框要么标注为背景,要么标注为与真实边缘框相关
可能生成大量锚框导致负样本过多
锚框可固定生成,或根据图片生成,甚至随机
假设一个图片有4个标签边缘框,生成了9个锚框,一种赋予标号的算法如下图
在预测时,使用非极大值抑制(NMS)输出
目标检测常用算法
Faster R-CNN图片进入一个CNN后分成两条路线,一条路线进 ...
D2L: Fine Tune
Fine TuneConcept and Principle
一般神经网络的架构都分为两块:
特征抽取部分
线性分类部分
微调
一个模型特征提取部分可以作为上游模型训练其他任务
pre-train的过程一般是一个大数据集上的正常训练任务,而在fine-tune的过程中使用更强的正则化、更小的学习率、更少的epoch
原数据集和目标数据集要相似,且原数据集比目标数据集要大
微调的一些技巧
重用分类器权重:原数据集中也可能有下游任务数据的部分标号,可以用预训练模型分类器中对应标号的对应向量来初始化下游任务分类部分
固定前面的层:神经网络中靠近输入的层更加通用,可以固定底部的一些层的参数不参与更新
对于个人或小企业来说,通常不会从头开始训练模型,而是进行微调
Implementation12345678910111213141516171819202122232425262728293031323334353637383940from torchvision import models,transformsfrom torch import nn,optimim ...
D2L: Data Augmentation
Data AugmentationConcept and Principle我们收集的训练数据通常很难覆盖到未来可能部署的全部场景(比如人脸识别的应用可能会部署到不同摄像头状况、天气、时间等的场景)。数据增强则在一个已有的数据上做数据变换,起到增大数据集的作用,使其有更好的多样性。
数据增强
数据增强只在训练时进行
一般采用在线生成的方式
数据增强假设测试环境中会出现增强后的数据,如果测试环境和训练集高度一致则没有必要做数据增强
数据增强方法
翻转(上下、左右翻转)
切割(随机高宽比、大小、位置切割一块,然后再变为固定大小)
颜色(色调、饱和度、亮度)
其他(高斯模糊、锐化、遮挡等)
Implementation1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162# pytorch在提供transforms模块中提供了很多数据增广函数from torchvision import transfo ...