原文:Github 项目 - CurriculumNet - AIUAI
论文:CurriculumNet: Weakly Supervised Learning from Large-Scale Web Images - ECCV2018
实现:<Github - research-curriculumnet - Caffe>
论文阅读学习 - CurriculumNet: Weakly Supervised Learning from Large-Scale Web Images - AIUAI
CurriculumNet 框架:
这里实现了关于论文里基于密度聚类算法(density-based clustering algorithm) 创建学习课程,以采用数据分布密度来评估训练样本的复杂度 - curriculum_clustering.
1. Models
基于的 Caffe 版本: OpenMPI-based Multi-GPU - https://github.com/yjxiong/caffe/
[1] - CurriculumNet(WebVision)
- 预训练模型 - inception_v2_webvision.caffemodel
- 网络定义 - inception_v2_deploy_webvision.prototxt
- 训练数据集 - WebVision 1.0
[2] - CurriculumNet(WebVision+ImageNet)
- 预训练模型 - inception_v2_web_img.caffemodel
- 网络定义 - inception_v2_deploy_web_img.prototxt
- 训练数据集 - WebVision 1.0 + ImageNet
模型精度:
Name | WebVision (Top-1) | WebVision (Top-5) | ImageNet (Top-1) | ImageNet (Top-5) |
---|---|---|---|---|
CurriculumNet(WebVision) | 27.9 | 10.8 | 35.2 | 15.1 |
CurriculumNet(WebVision+ImageNet) | 24.7 | 8.5 | 24.8 | 7.1 |
2. curriculum_clustering
课程聚类算法(Curriculum clustering algorithm):
在教授特定概念时,将学习的课程分解为由易到难,由简单到复杂,是很有帮助的.
对于机器学习中的一个课程,其包含不同难度的子集. 相比较于随机采样,从最简单的样本开始学习,然后逐渐到最复杂的样本.
这样,机器在遇到很复杂的样本前,能够建立对特定概念的坚实基础. 从简单样本开始学习,有助于机器对噪声(noisy, complex) 样本的学习.
这种半监督学习方法被称为课程学习(Curriculum Learning, CurriculumNet).
课程学习的输入是特征向量集合和其对应的概念**(类别)标签**.
正常情况下,聚类算法不需要标签,但,课程学习算法需要标签(通常是噪声的noisy). 因为课程学习算法时根据递增复杂的课程来表示待学习概念的(they represent the concepts that should be learned over a curriculum of increasing complexity).
课程的数据子集数量是由子集参数设定的.
课程聚类算法会以无监督方式,根据样本的分布密度,将每个概念类别的样本聚类为 N
个样本子集(The algorithm will cluster each concept category into N subsets using distribution density in an unsupervised manner.)
对于计算机视觉领域的应用,每个向量表示一张图像.
具有较高分布密度值的课程样本子集,其在特征空间内,所有的图像彼此很接近,即图像间具有较强的相似性. 称之为 干净(clean)数据集,其大部分样本标签时正确的.
具有较小分布密度值的课程样本子集,其图像具有较大的视觉表征差异性,可能包含更多的不正确标签的不相关图像. 称之为 噪声(noisy) 数据集.
因此,对于每一类别图像,这里生成多个样本子集,根据复杂度递增的顺序分别为: clean
, noisy
, highly noisy
.
# -*- coding: utf-8 -*-
import time
import numpy as np
from sklearn.base import BaseEstimator, ClusterMixin
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from sklearn.utils import check_array, check_consistent_length, gen_batches
def cluster_curriculum_subsets(X, y,
n_subsets=3,
method='default',
density_t=0.6,
verbose=False,
dim_reduce=256,
batch_max=500000,
random_state=None,
calc_auxiliary=False):
"""
对向量数组或距离矩阵,计算 Curriculum Clustering.
通过分析分布密度,将每一类别样本聚类为 n 个样本子集.
Parameters
----------
X : 数组或稀疏CSR矩阵,shape 为 (n_samples, n_features) 或 (n_samples, n_samples).
特征数组(样本的嵌入空间表示.)
y : array-like, size=[n_samples]
类别标签.
curriculum 会将每一类别自动聚类为 N 个子集.
verbose : bool, optional, default False
是否打印处理信息.
density_t : float, optional
邻近样本被聚类到一个子集的密度阈值.
n_subsets : int, optional (default = 3)
每一类别被聚类到的子集数量.
例如,设为 3,则输出类别会被设为 0,1,2.
0 - 最简单的样本(最相似样本);
1 - 中级难度样本(有些相似样本);
2 - 最复杂样本(大部分不同样本).
random_state : int, RandomState instance or None (default), optional
算法内用于随机选择的生成器.
设置 int 值,实现随机的确定化.
method : {'default', 'gaussian'}, optional
用于计算局部密度值的算法.
默认采用参考 CurriculumNet 论文里说明的算法.
dim_reduce : int, optional (default = 256)
特征向量降维后的数,先于距离计算.
维数越低,则速度越快,但精度降低. 反之.
batch_max : int, optional (default = 500000)
一次处理特征向量的最大 batch 数.(加载到内存的)
calc_auxiliary : bool, optional (default = False)
提供的辅助参数,如 delta centers 和 density centers.
有助于可视化,代码调试等.
其会导致处理时间明显增加.
Returns
-------
all_clustered_labels : array [n_samples]
每个样本点的聚类标签.根据由简单到复杂的次序整合.
如,如果 curriculum subsets=3,
则,label=0 - simplest, labels=1 - harder, label=n - hardest.
auxiliary_info : list
如果设置 calc_auxiliar=True,则该列表会包含在聚类过程中收集的辅助信息,
如,delta centers 等.
"""
if not density_t > 0.0:
raise ValueError("density_thresh must be positive.")
X = check_array(X, accept_sparse='csr')
check_consistent_length(X, y)
unique_categories = set(y)
t0 = None
pca = None
auxiliary_info = []
if X.shape[1] > dim_reduce:
pca = PCA(n_components=dim_reduce,
copy=False,
random_state=random_state)
# 初始化所有的标签为 negative,表示 un-clustered 'noise'.
# 聚类处理后,标签里应该包含 no negatives.
all_clustered_labels = np.full(len(y),<