news 2026/6/13 5:55:55

ResNet18半监督学习:小样本场景下的实战方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ResNet18半监督学习:小样本场景下的实战方案

ResNet18半监督学习:小样本场景下的实战方案

引言

在初创公司或小型团队中,我们常常面临数据量不足的困境。想象一下,你正在教小朋友认识动物,但手头只有几张猫狗的照片,这时候该怎么办?半监督学习就像一位聪明的老师,能够利用少量标注数据和大量未标注数据来提升学习效果。本文将带你用ResNet18这个轻量级模型,在小样本场景下实现高效的半监督学习。

ResNet18是计算机视觉领域的经典模型,它通过"跳跃连接"解决了深层网络训练难题,就像给学习过程加了记忆辅助工具。结合半监督学习技术,我们可以在标注数据有限的情况下,充分利用未标注数据提升模型性能。这种组合特别适合初创公司、个人开发者或学术研究中的小样本场景。

通过CSDN星图镜像广场提供的PyTorch+CUDA环境,我们可以快速部署实验环境,灵活调整计算资源。本文将手把手教你从数据准备、模型搭建到训练优化的完整流程,即使你是深度学习新手也能轻松上手。

1. 环境准备与数据加载

1.1 快速部署PyTorch环境

在CSDN星图镜像广场选择预置的PyTorch+CUDA镜像,一键部署即可获得完整的开发环境。这个镜像已经包含了PyTorch、TorchVision等必要库,省去了繁琐的环境配置过程。

# 检查环境是否正常 import torch print(torch.__version__) # 应显示1.x.x print(torch.cuda.is_available()) # 应返回True

1.2 准备小样本数据集

我们以CIFAR-10为例模拟小样本场景。假设你只有10%的标注数据(每类500张中的50张),其余90%作为未标注数据:

from torchvision import datasets, transforms import numpy as np # 定义数据增强 train_transform = transforms.Compose([ transforms.RandomHorizontalFlip(), transforms.RandomCrop(32, padding=4), transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) # 加载完整数据集 full_dataset = datasets.CIFAR10(root='./data', train=True, download=True) # 随机选择10%作为标注数据 np.random.seed(42) labeled_idx = np.random.choice(len(full_dataset), size=5000, replace=False) unlabeled_idx = list(set(range(len(full_dataset))) - set(labeled_idx)) # 创建数据集划分 labeled_dataset = torch.utils.data.Subset(full_dataset, labeled_idx) unlabeled_dataset = torch.utils.data.Subset(full_dataset, unlabeled_idx)

2. ResNet18模型改造

2.1 基础模型加载

PyTorch已经预置了ResNet18模型,我们可以直接加载并修改最后一层:

import torchvision.models as models # 加载预训练模型 model = models.resnet18(pretrained=False, num_classes=10) # CIFAR-10有10类 # 修改第一层卷积(原始ImageNet输入是224x224,CIFAR是32x32) model.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1, bias=False) model.maxpool = nn.Identity() # 移除第一个maxpool层

2.2 添加半监督学习组件

半监督学习的核心是利用未标注数据。我们采用伪标签(Pseudo Label)方法:

class SemiSupervisedModel(nn.Module): def __init__(self, base_model): super().__init__() self.base_model = base_model self.softmax = nn.Softmax(dim=1) def forward(self, x, is_labeled=True): logits = self.base_model(x) if is_labeled: return logits else: # 对未标注数据生成伪标签 probs = self.softmax(logits) _, pseudo_labels = torch.max(probs, dim=1) return logits, pseudo_labels

3. 半监督训练策略

3.1 混合数据加载器

我们需要同时加载标注数据和未标注数据:

from torch.utils.data import DataLoader # 标注数据加载器 labeled_loader = DataLoader(labeled_dataset, batch_size=64, shuffle=True) # 未标注数据加载器(使用更强的数据增强) unlabeled_transform = transforms.Compose([ transforms.RandomHorizontalFlip(), transforms.RandomCrop(32, padding=4), transforms.RandomApply([transforms.ColorJitter(0.4, 0.4, 0.4, 0.1)], p=0.8), transforms.RandomGrayscale(p=0.2), transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) unlabeled_dataset.transform = unlabeled_transform unlabeled_loader = DataLoader(unlabeled_dataset, batch_size=128, shuffle=True)

3.2 训练循环实现

半监督训练的关键是交替使用标注数据和未标注数据:

def train(model, labeled_loader, unlabeled_loader, optimizer, epoch): model.train() total_loss = 0 # 同时迭代两个数据加载器 labeled_iter = iter(labeled_loader) unlabeled_iter = iter(unlabeled_loader) for batch_idx in range(len(labeled_loader)): # 获取标注数据 try: inputs_l, targets_l = next(labeled_iter) except StopIteration: labeled_iter = iter(labeled_loader) inputs_l, targets_l = next(labeled_iter) # 获取未标注数据 try: inputs_u, _ = next(unlabeled_iter) except StopIteration: unlabeled_iter = iter(unlabeled_loader) inputs_u, _ = next(unlabeled_iter) # 合并数据并移动到GPU inputs = torch.cat([inputs_l, inputs_u]).cuda() targets_l = targets_l.cuda() # 前向传播 optimizer.zero_grad() outputs_l = model(inputs[:len(inputs_l)], is_labeled=True) outputs_u, pseudo_labels = model(inputs[len(inputs_l):], is_labeled=False) # 计算损失 loss_l = F.cross_entropy(outputs_l, targets_l) loss_u = F.cross_entropy(outputs_u, pseudo_labels.detach()) # 注意detach伪标签 loss = loss_l + 0.5 * loss_u # 未标注数据权重设为0.5 # 反向传播 loss.backward() optimizer.step() total_loss += loss.item() print(f'Epoch: {epoch}, Loss: {total_loss/len(labeled_loader):.4f}')

4. 关键参数与优化技巧

4.1 学习率调度

半监督学习对学习率敏感,建议使用余弦退火调度:

from torch.optim.lr_scheduler import CosineAnnealingLR optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9, weight_decay=5e-4) scheduler = CosineAnnealingLR(optimizer, T_max=200) # 200个epoch

4.2 置信度阈值

并非所有未标注样本都可靠,可以设置置信度阈值:

# 修改伪标签生成部分 probs = self.softmax(logits) max_probs, pseudo_labels = torch.max(probs, dim=1) mask = max_probs > 0.95 # 只选择高置信度样本 return logits, pseudo_labels, mask

4.3 模型集成

使用EMA(指数移动平均)模型能提升稳定性:

class EMA: def __init__(self, model, decay=0.999): self.model = model self.decay = decay self.shadow = {} self.backup = {} def register(self): for name, param in self.model.named_parameters(): if param.requires_grad: self.shadow[name] = param.data.clone() def update(self): for name, param in self.model.named_parameters(): if param.requires_grad: assert name in self.shadow new_average = (1.0 - self.decay) * param.data + self.decay * self.shadow[name] self.shadow[name] = new_average.clone() def apply_shadow(self): for name, param in self.model.named_parameters(): if param.requires_grad: assert name in self.shadow self.backup[name] = param.data param.data = self.shadow[name] def restore(self): for name, param in self.model.named_parameters(): if param.requires_grad: param.data = self.backup[name] self.backup = {}

总结

通过本文的实践方案,我们成功在小样本场景下实现了ResNet18的半监督学习。以下是核心要点:

  • 环境准备简单:利用CSDN星图镜像广场的PyTorch+CUDA镜像,可以快速搭建开发环境,省去配置烦恼
  • 数据效率高:仅需10%的标注数据配合90%的未标注数据,就能达到接近全监督学习的性能
  • 训练策略灵活:伪标签方法实现简单但效果显著,适合初创公司快速验证想法
  • 资源利用合理:半监督学习减少了数据标注成本,配合GPU资源可以高效完成实验迭代
  • 扩展性强:本文方法不仅限于CIFAR-10,可以轻松迁移到其他视觉任务

现在你就可以尝试在自己的小样本数据集上应用这套方案,实测下来效果稳定可靠。随着未标注数据的增加,模型性能还会持续提升,这正是半监督学习的魅力所在。


💡获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 15:53:57

ResNet18避坑大全:云端GPU按需使用,不花冤枉钱

ResNet18避坑大全:云端GPU按需使用,不花冤枉钱 1. 为什么选择ResNet18? ResNet18是深度学习领域最经典的图像分类模型之一,特别适合中小型数据集和快速验证场景。它就像摄影界的"傻瓜相机"——操作简单但效果可靠&…

作者头像 李华
网站建设 2026/6/10 14:14:14

多模态AI效率革命|基于Qwen3-VL-WEBUI构建智能办公助手

多模态AI效率革命|基于Qwen3-VL-WEBUI构建智能办公助手 在数字化办公日益普及的今天,传统“输入-输出”模式的人机交互已难以满足复杂、动态的工作场景。用户不再满足于让AI“看懂图片”或“写一段话”,而是期望它能真正理解上下文、执行任务…

作者头像 李华
网站建设 2026/6/10 13:04:54

Qwen3-VL-WEBUI部署实践|基于阿里开源视觉语言模型快速搭建交互界面

Qwen3-VL-WEBUI部署实践|基于阿里开源视觉语言模型快速搭建交互界面 随着多模态大模型在图像理解、视频分析和跨模态推理等领域的广泛应用,Qwen3-VL 作为通义千问系列中最新一代的视觉语言模型,凭借其强大的图文融合能力与增强的空间感知机制…

作者头像 李华
网站建设 2026/6/10 12:57:30

2026企业档案管理系统选型攻略:核心指标+避坑要点

在数字经济深度渗透的2026年,企业档案已从传统“纸质存根”升级为核心信息资产,档案管理系统也成为保障合规运营、提升协作效率的关键基础设施。然而,市场上系统产品琳琅满目,选型失误不仅会造成成本浪费,更可能埋下数…

作者头像 李华
网站建设 2026/6/11 13:38:12

Rembg抠图云部署:AWS/GCP实战指南

Rembg抠图云部署:AWS/GCP实战指南 1. 引言:智能万能抠图 - Rembg 在图像处理与内容创作领域,自动去背景是一项高频且关键的需求。无论是电商商品图精修、社交媒体素材制作,还是AI生成内容的后处理,传统手动抠图效率低…

作者头像 李华