open-set recognition(OSR)开集识别的一些思考(四)

时间:2024-04-13 10:34:32

前言:目前基于CNN方式的开集识别的方案最为经典的要数openmax方法,但是目前所能查到的资料对openmax解读的资料实在是太少,所以这里通过对openmax的实现过程进行讲解以达到理解的目的

下述的观点和叙述来自个人理解和对论文的解读-Towards Open Set Deep Networks

 softmax是分类网络中最常见的最后一层的**函数,用于概率值的生成,但是之前的文章说到过因为softmax的特性,导致不太适用于开集识别,所以这篇文章中提到了openmax,其可以认为是softmax的一个替代,但是在模型训练后的进行的处理,不可以简单的认为是创建了一个新的layer。由于整个文章主要就是提出openmax,所以整篇文章都是在对openmax的可行性做解释,接下来暂时不对整个文章做处理,只是对openmax以及其实现进行说明:

openmax是什么

 openmax是通过对softmax前一层特征的处理,也就是dense层的处理(这里的dense层不加任何的**函数,和**函数是分开的两层)

openmax的具体实现:

先看下文章中给出的伪代码
 通过看文章和看这些伪代码,能够大概知道openmax的计算原理,但是具体代码实现的时候面对这么多的参数,可能有的参数不知道如何计算得到,所以下面就用白话对该过程进行一个讲解。
Al1: 进行EVT拟合:
open-set recognition(OSR)开集识别的一些思考(四)
Al2: 进行Openmax的计算
open-set recognition(OSR)开集识别的一些思考(四)

白话openmax的实现:

 下面是具体处理和计算的流程:只计算并保留所有预测样本正确样本(预测错误(预测值和真实label不符)输出的舍弃)的特征值(特征值的长度就是类别的长度,比如最后的类别数量为3,那么这个特征就是长度为3的向量,而不是之前一层的向量),求出所有预测正确样本的向量,根据不同的类别(真实label)将这些向量对应分开,然后分别计算每个类别对应向量的均值作为该类别的中心(可认为类别的中心点,和聚类的中心点类似)。然后分别计算每个类别中每个样本对应向量和其类别中心的距离,然后对这些距离进行排序,针对排序后的几个尾部极大值进行极大值理论分析,这些极大值的分布符合weibull分布,所以使用weibull分布(libmr中的fithigh方法)来拟合这些极大的距离,得到一个拟合分布的模型,这时候基本上已经完成了上述的Algrithms 1。
 当我们来了一个新的测试图像的时候,这时候输入模型,先得到其对应的dense向量(softmax的前一层的),然后针对该向量分别针对每个类别计算与其之间的距离(共得到N(类别数量)个距离),然后针对上述得到的每个距离分别使用每个类别对应的拟合模型对其进行预测,最后会分别得到一个分数FitScores,这个分数就是指得是该测试图像特征值归属于其对应类别的的概率,所以一共是有N个分数的。然后根据该图像的最终输出(此处为softmax的输出),根据该概率分数的输出继进行排序,然后计算w的值(该值的计算就是根据采用tail的个数(即阿尔法的值)来计算的,比较简单就是一个固定的式子)for i=1...α      w=1FitScores(αi)/αfor \space i=1...\alpha \space\space\space\space\space\space w =1- FitScores*(\alpha-i)/\alpha
然后将该向量分别针对每个类别计算与其之间的距离与上述得到的W进行相乘,后续再进行类似softmax的操作,最终得到两个分数,一个是openmax后的分数,一个是unknowen的分数,注意这里得到的openmax的类别比softmax输出的类别多一个类别,也就是unkonowen的类别。

 作者想要达到的结果是,如果输入时已知的类别,那么openmax的输出就是已知的具体某个类别,如果测试时输入的为未知的类别,那么最终的输出就是unknow,这也就是开集识别最终想要得到的结果。根据作者在minist数据集上的测试结果感觉还可以,使用汉字或者孟加拉字母的话可以正确的别识别为未知的。

 该文章中很多的配图都是为了说明其设计的初衷和有效性,再看这篇文章的时候还有很多的理论不是很理解,比如weibull分布,EVT理论等等,所以为了更好的理解和复现就找了很多的资料,以此记录。

后续会放出来对应的代码(持更)