Github 项目 - CurriculumNet

CurriculumNet是ECCV2018的一篇论文提出的弱监督学习方法,利用大型网络图像进行学习。它实现了基于密度的聚类算法来创建学习课程,按数据分布密度评估样本复杂度。项目提供了在Caffe上的实现,包括两个预训练模型(基于WebVision和WebVision+ImageNet),并介绍了curriculum_clustering模块,该模块将样本按难度分为子集,以帮助机器逐步学习复杂概念。
摘要由CSDN通过智能技术生成

原文: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/

Models

[1] - CurriculumNet(WebVision)

[2] - CurriculumNet(WebVision+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

课程聚类算法(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),<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值