绘制t-SNE图

什么是t-SNE图?

如下图,下图来源于论文Contrastive Clustering
在这里插入图片描述一般用于分类问题/对比学习。

作用?

体现出经过层层训练,类内越来越紧密,类间差异越来越大;或者也可以做消融可视化。

怎么画?

以下是一个手写数字的例子,转载自添加链接描述

import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt_sne
from sklearn import datasets
from sklearn.manifold import TSNE
import os
 
 
def plot_tsne(features, labels, epoch,fileNameDir = None):
    '''
    features:(N*m) N*m大小特征,其中N代表有N个数据,每个数据m维
    label:(N) 有N个标签
    '''
    print(features.shape,labels.shape)
    print(type(features),type(labels))
    print(np.any(np.isnan(features)),np.any(np.isinf(features)))
    features = np.nan_to_num(features)
    if not os.path.exists(fileNameDir):
        os.makedirs(fileNameDir)
    import pandas as pd
    tsne = TSNE(n_components=2, init='pca', random_state=0)
    import seaborn as sns
 
    #查看标签的种类有几个
    class_num = len(np.unique(labels))  # 要分类的种类个数  eg:[0, 1, 2, 3]这个就是为4
    
    try:
        tsne_features = tsne.fit_transform(features)  # 将特征使用PCA降维至2维
    except:
        tsne_features = tsne.fit_transform(features)
    
    #一个类似于表格的数据结构
    df = pd.DataFrame()
    df["y"] = labels
    df["comp1"] = tsne_features[:, 0]
    df["comp2"] = tsne_features[:, 1]
    
    # hue:根据y列上的数据种类,来生成不同的颜色;
    # style:根据y列上的数据种类,来生成不同的形状点;
    
    sns.scatterplot(x= df.comp1.tolist(), y= df.comp2.tolist(),hue=df.y.tolist(),style = df.y.tolist(),
                    palette=sns.color_palette("Set2",class_num),
                    data=df).set(title="T-SNE projection")
    
    plt_sne.savefig(os.path.join(fileNameDir,"%s.jpg") % str(epoch),format = "jpg")
    plt_sne.show()
    
 
if __name__ == '__main__':
    digits = datasets.load_digits(n_class=2)
    features, labels = digits.data, digits.target
    print(features.shape)
    print(labels.shape)
 
    plot_tsne(features, labels, "Set2", fileNameDir="test")

在真正用在代码中时,可以像下面一样。

首先,我们需要导入一些必要的库:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE

然后,我们可以在训练循环的最后添加以下代码:

if epoch == 1:
    # 获取所有样本的特征向量
    all_features = []
    all_labels = []
    for inputs_x, targets_x in labeled_trainloader:
        if use_cuda:
            inputs_x = inputs_x.cuda()
        _, features, *_ = model(inputs_x)
        all_features.append(features.detach().cpu().numpy())
        all_labels.append(targets_x.numpy())
    all_features = np.concatenate(all_features, axis=0)
    all_labels = np.concatenate(all_labels, axis=0)

    # 计算 t-SNE 嵌入
    tsne = TSNE(n_components=2, random_state=42)
    X_tsne = tsne.fit_transform(all_features)

    # 绘制 t-SNE 图
    plt.figure(figsize=(10, 10))
    plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=all_labels, cmap='tab10')
    plt.colorbar()
    plt.title('t-SNE Visualization (Epoch 1)')
    plt.savefig('tsne_epoch_1.png')
    plt.close()

这段代码会在第一个 epoch 结束后,获取所有标记样本的特征向量,并使用 t-SNE 算法将它们映射到二维空间。然后,它会绘制一个彩色散点图,并保存为 tsne_epoch_1.png。

请注意,这只会在第一个 epoch 结束后执行一次,因为我们只想看到初始的 t-SNE 图。如果您想要在每个 epoch 结束后都绘制 t-SNE 图,可以将 if epoch == 1: 改为 if True:。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值