实验室出的一个做分类的点子:PEDCC还不错,研究一下,以此记录。
参考论文链接:(http://xueshu.baidu.com/usercenter/paper/show?paperid=18480cc0pt6n0ta0b2320m00mj799883&site=xueshu_se)


1、背景

从模式识别的角度来说,分类之前各个类的特征提取,类似于降维。主要目标就是生成不同类的类间距离极大、同一类类内距离极小的低维。

对于深度学习分类模型来说,最后的SoftmaxSoftmaxSoftmax层就是线性分类器,而前面的多层卷积网络我们可以理解为降维,以生成低维隐变量。如果生成的样本隐变量同一类之间类内差距小,不同类之间类间差距大,那么卷积神经网络可以学到更好的特征。同一类的类内的聚集程度对于学习能力较强的神经网络来说并非难事。但是不同类的类间距离则是一个较难控制的问题。因为不同的分类任务可能存在着不一样的距离较近的两个类别,类间距离较近,如果类内方差较大,会出现类别样本之间的重叠(就是一个类是一个球,如果两个球的距离相近,但是球的半径又很大,那么这两个球就会有相交部分),这样就会导致错误分类。

2、PEDCC

什么是PEDCC呢?预定义最优随机聚类中心的方式来人为设定隐变量的聚类中心,且这些聚类中心的距离都足够远(这句话是论文中翻译得来的,其实就是一个超球体上,我们人为地设定很多均匀分布的点,假设这些点是不同的类,注意是超球体,所以每个点是高维的,也可以想象每个点是个球)。

然后怎么做分类呢?通过卷积神经网络强大的拟合能力,把不同类别的样本分别映射到这个超球体的点上(也就是论文中所说的预定于类中心上),这是完全可以办到的。

我们下面来看看这个算法:

从上面的算法流程我们可以看出来:这边也是依靠L1L1L1来算距离的。

我们来解释一下上面的算法流程:假设所有的聚类中心分布在一个超球面上,目标是在ddd维球面上生成均匀分布的nnn个点作为聚类中心(这里面的d我们可以看成一个类的特征向量是d维),nnn是类别数。在球面上生成均匀分布的点没有显示的计算公式,并且具有无穷多个解,通常采用迭代方法求数值解。对于我们来说,只要这些中心点是均匀分布的即可,至于不同的类到超球面上的点映射问题深度学习具有足够的拟合能力实现这种映射。

论文中也对这个算法进行了物理解释:生成预定义类别中心的方法基于球面上的同性电荷能量最低的物理模型,即假设超球面上的n个电荷点相互之间有排斥力,排斥力随点间的距离增加而减少,当运动最后平衡,超球上的点停止运动时,由于斥力的存在,NNN个点最后会在超球面上均匀分布,达到平衡状态时就可以使超球面上的NNN个点相距最远。我们定义中心点的每一维都有一个ViV_iVi​ 运动量,来描述运动状态,每一步计算更新所有点的运动状态。

拿论文中的一个列子来说明:假设输入图片的尺寸为 m×mm×mm×m, 自编码器的编码器输出特征的维度为 ddd,数据集的类别数为nnn。为了保证迭代中预定义中心点之间的距离不会过近,算法1需要设定距离阈值 ε,当两点之间距离小于ε则设置成ε,继续迭代,这里我们的ε设定为0.01。具体算法如表1所示,算法1需要输出 nnn 个ddd 维的预定义类中心 (u1,...,un)(u_1,...,u_n)(u1​,...,un​) 。首先需要在ddd维正态分布中随机采样nnn个向量来表示预定义中心的集合UUU的初始值 ,然后每一个类别都对应一个速度状态量(v1,...,vn)(v_1,...,v_n)(v1​,...,vn​), 描述它们的运动状态。然后进入迭代,计算初始n个向量之间的距离矩阵,然后根据距离矩阵计算每一个类别中心受到其他点的合力,进而得到合力的法向量,先由当前的速度向量更新每一个类别中心的位置,然后根据合力的切向量更新速度,直到达到最大迭代次数则算法结束。

论文中还给出可视化例子:设置特征维数d=3d=3d=3,设置类别数n=2,4,10,20n=2,4,10,20n=2,4,10,20,可视化球体。

预定义中心初值是随机生成的,收敛的结果收到初值影响,但最后分布将是均匀的,并且一旦确定以后,在后面的网络训练中就不再改变。

注意:这边需要的是特征维数(d)要大于类别数(n),这样才会保持均匀分布。


3、代码实现

代码来自于师兄开源的代码:详细链接可在论文中找到

# 生成预定义类中心
import numpy as np
import pickle
import torch
import os
class_num = 100 #生成的类别数
latent_variable_dim = 256 #每个类的特征维度
PEDCC_root=" " #存储的路径
PEDCC_ui=" " #存储的路径if not os.path.isdir(PEDCC_root):os.makedirs(PEDCC_root)mu=np.zeros(latent_variable_dim)
sigma = np.eye(latent_variable_dim)
u_init = np.random.multivariate_normal(mu,sigma,class_num) # N(0,1)初始化随机值
v = np.zeros(u_init.shape)
u=[]  # listfor i in u_init:i=i/np.linalg.norm(i)  # 求范数u.append(i)
u=np.array(u)
G=1e-2def countnext(u,v,G):num = u.shape[0]dd = np.zeros((latent_variable_dim,num,num))for m in range(num):for n in range(num):dd[:,m,n] = (u[m,:]-u[n,:]).Tdd[:,n,m] = -dd[:,m,n]L=np.sum(dd**2,0)**0.5L=L.reshape(1,L.shape[0],L.shape[1])L[L<1e-2] = 1e-2a=np.repeat(L**3,latent_variable_dim,0)F=np.sum(dd/a,2).Ttmp_F=[]for i in range(F.shape[0]):tmp_F.append(np.dot(F[i],u[i]))d=np.array(tmp_F).T.reshape(len(tmp_F),1)Fr = u*np.repeat(d, latent_variable_dim, 1)Ft = F-Frun = u+vll = np.sum(un**2,1)**0.5un=un/np.repeat(ll.reshape(ll.shape[0],1),latent_variable_dim,1)vn = v+G*Ftreturn un,vndef generate_center(u,v,G):for i in range(200):un,vn=countnext(u,v,G)u=unv=vnreturn u*(latent_variable_dim)**0.5# return rr1=generate_center(u,v,G)f=open('./tmp.pkl','wb')
pickle.dump(r1,f)
f.close()ff=open("./tmp.pkl",'rb')
b=pickle.load(ff)
ff.close()os.remove("./tmp.pkl")fff=open(PEDCC_ui,'wb')
map={}for i in range(len(b)):map[i]=torch.from_numpy(np.array([b[i]]))
pickle.dump(map,fff)
fff.close()

Predefined Evenly-Distributed Class Centroids(PEDCC)预定义类中心做分类解读相关推荐

  1. java基础入门-预定义类与自定义类

    预定义类与自定义类 先上代码 <span style="font-size:14px;">package com.ray.object;import java.util ...

  2. 【Java核心技术卷一】对象与类:使用预定义类与用户自定义类

    使用预定义类与用户自定义类 一.预定义类 1.对象与对象变量 2.LocalData类 3.更改器方法与访问器方法 二.用户自定义类 1.Employee类 2.多个源文件的使用 3.剖析Employ ...

  3. Flink Pre-defined Timestamp Extractors / Watermark Emitters(预定义的时间戳提取/水位线发射器)...

    https://ci.apache.org/projects/flink/flink-docs-release-1.6/dev/event_timestamp_extractors.html 根据官网 ...

  4. oracle有三种类型的异常错误: 预定义 ( Predefined )错误里面的常见错误

    oracle有三种类型的异常错误: 预定义 ( Predefined )错误, 非预定义 ( Predefined )错误, 用户定义(User_define) 错误 预定义 ( Predefined ...

  5. PHP Predefined Interfaces 预定义接口

    2019独角兽企业重金招聘Python工程师标准>>> SPL提供了6个迭代器接口: Traversable 遍历接口(检测一个类是否可以使用 foreach 进行遍历的接口) It ...

  6. Predefined Shader preprocessor macros //预定义的着色器预处理宏

    Predefined Shader preprocessor macros 预定义的着色器预处理宏 Unity defines several preprocessor macros when com ...

  7. 通过一段简单的代码,介绍 ABAP 的预定义类型 c

    下面这段代码,稍稍有些编程基础的朋友想必都能够理解: 定义了两个 ABAP 变量,名称分别为 lv_c1 和 lv_c2, 类型为 c,c 是 ABAP 的预定义数据类型(predefined dat ...

  8. Oracle PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR

    抛出异常 Oracle有三种类型的异常错误: 1. 预定义(Predefined)异常 ORACLE预定义的异常情况大约有24个.对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发. ...

  9. sql数据导入错误代码: 0x80004005_PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR...

    抛出异常 Oracle有三种类型的异常错误: 1. 预定义(Predefined)异常 ORACLE预定义的异常情况大约有24个.对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发. ...

  10. 创建一个显示所有预定义系统颜色的ListBox

    原文 Creating a ListBox that Shows All Predefined System Colors 该System.Windows.SystemColors类包含了一系列揭露当 ...

最新文章

  1. window10最全win键组合技巧(win10快捷键)
  2. MPLS ×××跨域实现之OPTION B配置讲解
  3. VisualStudio配置中文提示
  4. php合成或者创建gif动画
  5. 终于解决H3C交换机reset saved-configuration后不能启动的问题
  6. Oracle 19.8新特性asmcmd credverify and asmcmd credfix
  7. 安装caffe时出现“MySQL”不是内外不wenjian
  8. [转]学会使用DB2指令
  9. IntelliJ IDEA 背景色以及字体设置
  10. LoadRunner压力测试案列
  11. STM32入门(二)
  12. C#上位机与欧姆龙PLC通讯(FINS)
  13. android reboot 消息,android reboot 流程
  14. 图神经网络(ICML2022)
  15. Android 中光线传感器的使用详解
  16. 拓客必备神器:采集工具让你的数据采集更快更准
  17. postgre导入dmp文件
  18. 2021.04.09丨使用featurecount进行定量处理
  19. 获取腾讯微博信息API
  20. 用matlab读csv数据_matlab 读文件csvread textread用法实例

热门文章

  1. 用猎头的方式来找工作
  2. 自定义对象转换接口实现JDBC的封装
  3. 从URDF到KDL(C++Python)
  4. ZOJ 1788 Quad Trees
  5. 更快更强!华为大数据新版本让Hive提速50%!
  6. 计算机抠图知识,计算机PS抠图方法.doc
  7. 【计算机视觉】opencv靶标相机姿态解算1之基本概念(空间旋转、旋转轴)
  8. [架构之美]一款APP从想法-开发-上线-产品的全过程
  9. 四/六层板层叠设计思路
  10. java 微信公众号发红包_【微信支付】现金红包开发者文档