BYOL(Bootstrap your own latent A new approach to self-supervised Learning)算法笔记

Bootstrap your own latent A new approach to self-supervised Learning


引导你自己潜在的自我监督学习的新方法

论文链接:https://arxiv.org/abs/2006.07733
复现代码:https://github.com/HibikiJie/BYOL
\

为什么使用自监督学习

网络更加庞大,难以训练,需要大量的标记数据来监督训练,成本过高。所以需要一种自监督学习,来训练网络,使网络更加泛化。

在这里插入图片描述

网络没有预训练,直接使用在自己的标签数据上时,效果可能不会太好,并且收敛也较慢。如果网络能在大规模的数据集上完成自监督训练,只需要训练出它的强特征提取能力,无论是在后续的任务中,是冻结网络权重,还是不冻结权重继续学习有标签数据,网络都是能够提供极强的特征提取能力,并且极大提高网络收敛速度。该方法更多是为网络的迁移学习做准备的,特别是在应对数据量非常少的情况下,如果网络没有一个事先的强特征提取能力,对后续特定学习效果将不会太好,并且也将影响网络泛化性。


\

方法

在这里插入图片描述

输入一张图片(input image),记作 x x x ,通过两种随机的图像增强策略(记作: t t t t ′ t^{'} t),得到两种不同的图片(记作: v v v v ′ v^{'} v),但语义内容相同的图片。

在这里插入图片描述

再将图片 v v v 输入网络( 网络记作 f θ f_{\theta} fθ,其中网络参数为 θ \theta θ )中,得到这张图片对于网络 f θ f_{\theta} fθ 的一个表示(representation, y θ y_{\theta} yθ ),也就是说是,图片输入网络后,得到的特征图(feature map)为 y θ y_{\theta} yθ 。之后将 y θ y_{\theta} yθ 输入 后续网络(记作 g θ g_{\theta} gθ ),将 y θ y_{\theta} yθ 的特征图投射至一个更加高维的潜在空间,得到输出特征向量 z θ z_{\theta} z

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
以下是使用 BYOLBootstrap Your Own Latent算法训练 CIFAR-10 数据集并绘制 t-SNE 图的示例代码: 首先,确保已安装必要的库,如 pytorch、torchvision、numpy 和 sklearn。然后,按照以下步骤进行操作: ```python import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms import numpy as np from sklearn.manifold import TSNE import matplotlib.pyplot as plt # 设置随机种子以确保实验的可复现性 torch.manual_seed(0) np.random.seed(0) # 加载 CIFAR-10 数据集 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=128, shuffle=True) # 定义 BYOL 网络模型(示例) class BYOLNet(nn.Module): def __init__(self): super(BYOLNet, self).__init__() # 定义网络结构,这里仅作示例,你可以根据需要自定义网络结构 self.encoder = nn.Sequential( nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2), nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2), nn.Flatten(), nn.Linear(32 * 8 * 8, 128), nn.ReLU() ) def forward(self, x): return self.encoder(x) # 定义 BYOL 训练函数 def train_byol(model, dataloader, optimizer, device): model.train() for data, _ in dataloader: data = data.to(device) optimizer.zero_grad() output = model(data) loss = torch.mean(output) # 示例损失函数,你可以根据需要修改 loss.backward() optimizer.step() # 创建 BYOL 模型实例 model = BYOLNet() # 定义优化器和设备 optimizer = optim.Adam(model.parameters(), lr=0.001) device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 将模型移动到设备上 model.to(device) # BYOL 训练循环 num_epochs = 10 for epoch in range(num_epochs): train_byol(model, train_loader, optimizer, device) # 获取训练集的特征向量 features = [] labels = [] for data, target in train_loader: data = data.to(device) output = model.encoder(data).detach().cpu().numpy() features.extend(output) labels.extend(target.numpy()) # 使用 t-SNE 进行降维 tsne = TSNE(n_components=2) features_tsne = tsne.fit_transform(features) # 绘制 t-SNE 图 plt.scatter(features_tsne[:, 0], features_tsne[:, 1], c=labels, cmap='tab10') plt.colorbar() plt.show() ``` 这段代码会训练 BYOL 模型使用 CIFAR-10 数据集,并使用 t-SNE 算法将训练集的特征向量降维为二维,并将其可视化在散点图上。你可以根据需要自定义 BYOL 网络模型、损失函数、优化器等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值