此算法构造分类器的过程就是构造一个样本集。根据样本集进行分类。
一、分类原理:
(一)如何分类呢?
①要分类的图片为x
②得到图片x的特征向量
③得到样本集中每个样本的特征向量。对每个类的特征向量加和取平均得到每个类别的样本平均。
④图片x的特征向量跟哪个样本平均距离近,则说明该图片与哪个类别更相似,则其属于哪个类别。
(二)举个例子:
我们需要对紫色的变体五角星进行分类,由于它与红点平均样本更相近,则将它分到五角星类别中。
二、如何构造存储样本
样本集中容纳的样本数是一个定值K。当前类别数为t。每个类别可以存储的样本数量则为K/t,结果进行四舍五入,取整数。每当增加新的类别时,都会重新构造样本集。分两种情况,对于新增类别需要在样本集中添加k/t个样本。对于旧类别,需要再样本集中减少样本数量到k/t个。
(一)为新增类别在样本集中添加k/t个样本:
1.用最近的数据表示模型求得新增类别中每个样本的向量。
2.接下来就是得到m=k/t个有序的样本。
m个样本并不是越靠近样本均值的排在前面。这样可能存在一个问题,因为以后我们需要用m个样本的均值作为整个类别的均值。并且m的值是越来越小的。很有可能m个接近样本均值的样本偏向一侧,这样,m个样本取平均值则与样本均值相差甚远。
m个样本应该是一个一个增加,每增加一个,例如增加的是第k个样本,则保证前k个样本的平均值与样本均值距离最近,这样每增加一个样本都可以保证加和取平均与样本均值距离最近。所以就算之后每个类都会动态的减少存储样本,剩下的样本向量的平均值也可以代表样本均值。
(二)为每个旧类别在样本集中较少样本数量到m=k/t个:
在每个旧类别存储样本中取前m个。这m个加和取平均也可很好地代表该类的样本均值。
三、如何获得某图片的向量
(一)得到数据表示所用网络:cnn网络。
隐层:几层的cnn网络隐层用什么层都无所谓,
输出层:神经元与类别个数相同,每个神经元用sigmoid函数作为激活函数。
(二)得到图片向量的流程:
1.将存储的数据集和新增类别的数据集合并形成一个包含新旧所有类别的新的数据集。
2.每个旧类的样本x_i输入到旧模型中得到输出q_i,备用。
3.损失函数:计算输出层每个神经元sigmoid函数损失之和。新类别神经元与旧类别神经元的损失函数计算稍有差别,
(1)新类别神经元的输出越接近标签的值(0或1)损失值越小,所以新类别神经元的损失函 数为Cost(g(x_i), y_i)
(2)而旧类别神经元的输出越接近该样本在旧模型中的输出越好,所以旧类别神经元的损失函数为Cost(g(x_i), q_i)。此损失称为蒸馏损失。
四、补充
(一)为何要用蒸馏损失?
在旧类别上,尽可能使旧类别样本在新模型的输出接近于在旧模型中的输出。从而达到新模型汲取旧模型的知识的目的,减弱对旧类别分类的遗忘。
(二)为何在旧类别上,标签用q_i 和不用y_i?
如果用y_i就相当于用新的数据集重新训练了一个新模型。与旧模型完全无关。由于旧类别中样本数据在减少,所以新模型在旧类上的训练会随着类别个数的增加而越来越不充分。会造成欠拟合。而如果尽可能的保持新旧模型在旧样本的输出相近,可以减弱这个问题。毕竟就旧模型对旧类别的训练比新模型充分。
可以在我的csdn中找到论文文档。名称为论文名称。