Pseudo-Label : The Simple and Efficient Semi-Supervised Learning Method for Deep Neural Networks学习笔记

本文介绍了伪标签(Pseudo-Label)在半监督学习中的应用,核心思想是利用训练模型为无标签数据生成伪标签,并结合熵正则化进行模型训练。文章提到了去噪自动编码器(DenoisingAuto-Encoder,DAE)作为预训练方法,并展示了在有限有标签数据情况下,如何通过调整权重系数平衡有标签和无标签数据的损失函数,以提高模型性能。实验结果显示,伪标签方法在数据量较少时能显著提升模型效果。

论文地址:Pseduo-Label
从DAFomer溯源到的论文

伪标签的介绍

伪标签的介绍可以参考:伪标签(Pseudo-Labelling)——锋利的匕首,详细介绍了什么是伪标签方法以及伪标签方法的分类,本论文用到的方法就是上文中的 创新版伪标签的方法(将没有标签的数据的损失函数也加入进来,就是最后公式后边那一坨,具体如下图)
在这里插入图片描述

论文介绍

核心思想

Pseudo-Label 模型作为一个简单、有效的半监督学习方法早在 2013年就被提出,其核心思想包括两步:

  • 第一步:运用训练出的模型给予无标签的数据一个伪标签。方法很直接:用训练中的模型对无标签数据进行预测,以概率最高的类别作为无标签数据的伪标签
  • 第二步:运用 entropy regularization(熵正则化化) 思想,将无监督数据转为目标函数的正则项(如下文公式)。实际中,就是将拥有伪标签的无标签数据视为有标签的数据,然后用交叉熵来评估误差大小

相关流程

使用有标签数据和无标签数据同时以有监督的方式训练预训练网络。对于无标签的数据,在每次权值更新时重新计算的伪标签,被用于与监督学习任务相同的损失函数计算(即每次权值更新时,都重新计算伪标签,并将该伪标签当作真是标签用于计算损失函数)。

相关函数

Denoising Auto-Encoder

去噪自动编码器是一种无监督学习算法,基于使学习的表示对输入模式的部分破坏具有鲁棒性的思想。该方法可以用于训练自动编码器,这些微分代数方程组(DAE)可以堆叠起来初始化深度神经网络:

h i = s ( ∑ j = 1 d v W i j x ~ j + b i ) h_i=s(\sum_{j=1}^{d_v}W_{ij}\tilde x_j+b_i) hi=s(j=1dvWijx~j+bi)
x ^ j = s ( ∑ i = 1 d h W i j h i + a j ) \widehat x_j=s(\sum_{i=1}^{d_h} W_{ij}h_i+a_j) x j=s(i=1dhWijhi+aj)
x ~ j \tilde x_j x~j是第 j 个输入值的损坏版本
x ^ j \widehat x_j x j是第 j 个输入值的重构

自动编码训练在于最小化 x j x_j xj x ^ j \widehat x_j x j重构误差(error)。对于二分类输入值,常用的重构误差选择是交叉熵:
L ( x , x ^ ) = ∑ j = 1 d v − x j l o g

仅给定的三条引用内容未涉及“基于原型的伪标签细化方法用于半监督高光谱图像分类”以及 “Prototype-based pseudo-label refinement for semi-supervised hyperspectral image classification” 的相关信息,无法依据这些引用准确回答。不过,一般而言,在半监督高光谱图像分类里,基于原型的伪标签细化方法会先利用少量有标签样本构建原型,这些原型代表不同的类别特征。接着,用这些原型为无标签样本生成伪标签。之后,通过一系列细化操作来提升伪标签的质量,例如考虑局部上下文信息、特征相似性等。 伪代码示例(仅为概念示意): ```python # 假设 hyperspectral_data 是高光谱图像数据, labeled_indices 是有标签样本的索引, labels 是对应标签 import numpy as np def prototype_based_pseudo_label_refinement(hyperspectral_data, labeled_indices, labels): # 构建原型 prototypes = [] unique_labels = np.unique(labels) for label in unique_labels: label_indices = np.where(labels == label)[0] prototype = np.mean(hyperspectral_data[labeled_indices[label_indices]], axis=0) prototypes.append(prototype) # 为无标签样本生成伪标签 unlabeled_indices = np.setdiff1d(np.arange(len(hyperspectral_data)), labeled_indices) pseudo_labels = [] for idx in unlabeled_indices: distances = [np.linalg.norm(hyperspectral_data[idx] - proto) for proto in prototypes] pseudo_label = np.argmin(distances) pseudo_labels.append(pseudo_label) # 伪标签细化(简单示例:基于局部上下文) refined_pseudo_labels = [] for i, idx in enumerate(unlabeled_indices): # 这里简单假设周围 3 个样本作为局部上下文 local_indices = get_local_indices(idx, hyperspectral_data.shape) local_pseudo_labels = [pseudo_labels[np.where(unlabeled_indices == local_idx)[0][0]] for local_idx in local_indices if local_idx in unlabeled_indices] if len(local_pseudo_labels) > 0: most_common_label = np.bincount(local_pseudo_labels).argmax() refined_pseudo_labels.append(most_common_label) else: refined_pseudo_labels.append(pseudo_labels[i]) return refined_pseudo_labels def get_local_indices(idx, shape): # 获取周围 3 个样本的索引 rows, cols = shape[:2] row, col = np.unravel_index(idx, (rows, cols)) local_indices = [] if row > 0: local_indices.append(np.ravel_multi_index((row - 1, col), (rows, cols))) if row < rows - 1: local_indices.append(np.ravel_multi_index((row + 1, col), (rows, cols))) if col > 0: local_indices.append(np.ravel_multi_index((row, col - 1), (rows, cols))) if col < cols - 1: local_indices.append(np.ravel_multi_index((row, col + 1), (rows, cols))) return local_indices ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值