CIFAR10 T-SNE 绘制特征空间图

基本思想就是把测试数据输入模型,然后对模型提取的特征(未经过分类器)的部分进行降维绘图

1. 先引入包

import torch
from sklearn.manifold import TSNE # 这个是绘图关键
import random
import numpy as np
import matplotlib.pyplot as plt
import torch.nn as nn
from torchvision import datasets, transforms

2. 设置随机种子

为保证结果可复现,设置了随机种子

def setup_seed(seed):
    torch.manual_seed(seed)
    torch.cuda.manual_seed_all(seed)
    np.random.seed(seed)
    random.seed(seed)
    torch.backends.cudnn.benchmark = False
    torch.backends.cudnn.deterministic = True
setup_seed(1337)

3. 准备测试数据及模型

transform = transforms.Compose(
            [transforms.ToTensor(),
             transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])  # 对读取数据做个处理,打个包
testset = datasets.CIFAR10(root='../data/MNIST/', train=False,
                           download=False, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=32,
                                         shuffle=False, num_workers=2)
model_file = ["centralized_net.pkl"]
model = torch.load(model_name)

4. 输入测试数据得到特征表示

model.eval()
with torch.no_grad():
    for i, (image_batch, label_batch) in enumerate(testloader):
        image_batch, label_batch = image_batch.cuda(), label_batch.cuda()
        label_batch = label_batch.long().squeeze()
        inputs = image_batch
        logits, feature = model(inputs)
        if i == 0:
            feature_bank = feature
            label_bank = label_batch
            logits_bank = logits
        else:
            feature_bank = torch.cat((feature_bank, feature))
            label_bank = torch.cat((label_bank, label_batch))
            logits_bank = torch.cat((logits_bank, logits))

5. 绘图

针对feature_banklabel_bank进行绘图

 feature_bank = feature_bank.cpu().numpy()
 label_bank = label_bank.cpu().numpy()
 p, pseu = torch.max(torch.softmax(logits_bank, dim=-1), dim=-1)
 prob_bank = p.cpu().numpy()
 tsne = TSNE(2)
 output = tsne.fit_transform(feature_bank) # feature进行降维,降维至2维表示
 # 带真实值类别
 for i in range(10):	# 对每类的数据画上特定颜色的点
     index = (label_bank==i)
     plt.scatter(output[index, 0], output[index, 1],s=5, cmap=plt.cm.Spectral)
 plt.legend(["0", "1", "2", "3", "4", "5", "6","7", "8", "9"])
 plt.show()

在这里插入图片描述

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
以下是使用 BYOL(Bootstrap 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 网络模型、损失函数、优化器等。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值