什么是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:。