AI算法基础 [2]:NC4HW4数据排布
前言
NC4HW4的数据排布其实就是和RGBA这种交织的数据排布类似
NCHW->NC4HW4
首先batch维度就是N不变
然后把每个样本所有feature map按每四个通道为一组分成C/4个组,如果通道数不能整除4则补齐到4的倍数,补上的feature map全填0
然后把每组内的4个feature map按照RGBA交织的形式重新排列一下就得到NC4HW4的数据了。
优点
以卷积操作举例,此处只讨论暴力方法,不涉及im2col,gemm, winograd等方法。
对于卷积操作, 根据计算机内存排布特点,按行进行处理,处理完一个通道的数据,转入下一个通道继续按行处理。下图是一个通道内卷积的操作:
对于一个nchw格式的Tensor来说,其在计算机中的内存排布是这样的:
当一条指令处理一个数据时,卷积操作需要做循环乘累加,如下图所示,与kernel对应的featuremap中的数据不是连续分布的。如果feature map空间size很大的话,这样跳通道取数据,就会造成cache miss严重影响运行性能。
除此之外,当kernel size ...
C++之类与对象 [1]: 多态
多态性
目的:不同对象在接收到相同消息时(操作/函数)做不同响应
现象:对应同样成员函数名称,执行不同函数体
多态性的实现
虚函数:使用virtual关键字声明成员函数
声明格式: virtual 函数返回值 函数名称(参数列表); (派生类重新实现时加不加virtual都行)
指向派生类的基类指针会调用对应派生类实现的虚函数
如果派生类不实现虚函数,则继承基类的虚函数实现
当类中有虚函数的时候,会维持一个虚表指针,虚表指针指向虚表中对应到该类的虚函数的函数入口地址(运行时确定),这叫做函数的动态绑定(非虚函数是静态绑定)
静态类型:对象在声明时采用的类型,在编译期既已确定;
动态类型:通常是指一个指针或引用目前所指对象的类型,是在运行期决定的;
静态绑定:绑定的是静态类型,所对应的函数或属性依赖于对象的静态类型,发生在编译期;
动态绑定:绑定的是动态类型,所对应的函数或属性依赖于对象的动态类型,发生在运行期;
对象的动态类型可以更改,但是静态类型无法更改;
要想实现多态,必须使用动态绑定;
在继承体系中只有虚函数使用的是动态绑定,其他的全部是静态绑定 ...
AI算法基础 [1]:mIoU
IoU(Intersection over Union 交并比)
就是矩形框A、B的重叠面积占A、B并集的面积比例。
IoU=Area(A∩B)/Area(A∪B)
预测的结果往往就是四种情况:
true positive(TP) 真正 被判定为正样本,事实上也是正样本
false positive(FP) 假正 被判定为正样本,但事实上是负样本
true negative(TN) 真负 被判定为负样本,事实上也是负样本
false negative(FN) 假负 被判定为负样本,但事实上是正样本
第二个字母:What’s your judgement about the sample?
第一个字母:Is your judgement right(true) or not(false)?
基于以上定义:IoU=TP/(FP+FN+TP)
mIoU(Mean Intersection over Union)均交并比
即对每个类别计算出的IoU求平均。
其中,i表示真实值,j表示预测值,pij表示将i预测成j的数量,故上式等价于