论文里需要用到t-SNE对特征进行可视化,原理还没细看,但总体思路比较清晰,具体实现网上也有现成的代码。
对输出层的前一层特征提取出来,比如某个batch,维度是(b, 300),对应的target也提取出来,维度(b, k),注意这里需要把one-hot转化为类别形式,
注意,需要把整个测试集都过一遍,因此用列表来存每个batch的输出,然后再用torch.stach转化为tensor,最后再转化为numpy格式
x_tsne = []
y_tsne = []
for i, data in enumerate(val_unseen_loader):
# data_time = time.time() - test_start_time
val_unseen_inputs, val_unseen_labels = data['image'], data['target']
val_unseen_inputs = val_unseen_inputs.to(device)
val_unseen_labels = val_unseen_labels.to(device)
with torch.no_grad():
logits1, logits2, x_sem = model_OpenML(val_unseen_inputs, mode='val_zsl')
targets = val_unseen_labels.clone()
targets[targets==0] = 1
targets[targets==-1] = 0
x_tsne.append(x_sem)
y_tsne.append(targets)
因为我是多标签数据,所以这里采取的思路是把多标签转化为多个单标签样本,也就是多个one-hot标签
# 把多标签转化为单标签,图像特征直接复制
t_features = []
t_labels = []
for i in range(len(x_tsne)):
for j in range(x_tsne[i].shape[0]):
label_index = torch.where(y_tsne[i][j]>0)[0]
for lab in label_index:
t_features.append(x_tsne[i][j].unsqueeze(0))
t_labels.append(lab)
input_tsne = torch.cat(t_features, dim=0).cpu().numpy()
label_tsne = np.zeros(len(t_labels))
for i in range(len(t_labels)):
label_tsne[i] = t_labels[i].cpu().numpy()
然后可以把input_tsne和label_tsne作为tSNE模型的输入进行训练
import numpy as np
import matplotlib.pyplot as plt
from sklearn import manifold,datasets
tsne = manifold.TSNE(n_components=2, init='pca', random_state=501, n_iter=500)
X_tsne = tsne.fit_transform(input_tsne)
这里参数再根据实际效果调节下
训练完开始画图:
import numpy as np
from sklearn.datasets import load_digits
from scipy.spatial.distance import pdist
# from sklearn.manifold.t_sne import _joint_probabilities
from scipy import linalg
from sklearn.metrics import pairwise_distances
from scipy.spatial.distance import squareform
from sklearn.manifold import TSNE
from matplotlib import pyplot as plt
import seaborn as sns
sns.set(rc={'figure.figsize':(11.7,8.27)})
# palette = sns.color_palette("bright", 17)
palette = sns.color_palette('tab20b_r', n_colors=17)
# palette = sns.color_palette('tab20b', n_colors=17)
sns.scatterplot(X_tsne[:,0], X_tsne[:,1], hue=label_tsne, legend='full', palette=palette)
https://www.cntofu.com/book/172/docs/54.md
seaborn中文文档
https://blog.csdn.net/qq_42554007/article/details/82624418
seaborn调色
https://blog.csdn.net/weixin_41391619/article/details/115719116
seaborn调色
https://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.html
sklearn t-SNE具体参数
https://zhuanlan.zhihu.com/p/148170862
t-SNE原理
人生苦短,何不用python