什么是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 osdef 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 pdtsne = TSNE(n_components=2, init='pca', random_state=0)import seaborn as sns#查看标签的种类有几个class_num = len(np.unique(labels)) # 要分类的种类个数 eg:[0, 1, 2, 3]这个就是为4try:tsne_features = tsne.fit_transform(features) # 将特征使用PCA降维至2维except:tsne_features = tsne.fit_transform(features)#一个类似于表格的数据结构df = pd.DataFrame()df["y"] = labelsdf["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.targetprint(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:。