0


利用t-SNE可视化自己的数据集分布

自己做实验时想看一看自己数据集的分布,在网上找了一圈发现大家都是用的降维的方式查看,比较火的有PCA和t-SNE。网上很多教程都是用的Mnist数据集来演示t-SNE的可视化,但我的数据集是三维的图像,和网上的不太一样,因此记录一下自己的实验过程。

注意几点:

1、使用代码之前需要先安装一个t-SNE的库,地址是GitHub - CannyLab/tsne-cuda: GPU Accelerated t-SNE for CUDA with Python bindings。该库是github上一个高分的开源库,用了cuda加速实现起来比sklearn的t-SNE要快得多,从读取到画图我自己实验确实只需要10秒不到的时间。

2、github上下载TSNE-CUDA项目到本地后,在终端的虚拟环境中输入

pip install -e .

安装好后输入

import tsnecuda
tsnecuda.test()

没有报错说明安装成功

3、在TSNE-CUDA文件夹下创建数据集文件data_set,data_set里放自己的数据集(比如我的数据集叫radar_oldANDyoung,里边包含train和val两个文件夹,每个文件夹下边分别有5个子文件夹,命名为1-5),其中1-5分别为类名,每个类下边是属于该类的图片

4、在examples文件夹下创建python文件,比如my_tSNE.py,把我下边的代码粘贴进去

5、几个需要修改的地方我的代码里基本都有注释,不懂的可以在本帖下边留言,不定期回复

6、结果图:

import numpy as np
from tsnecuda import TSNE
import matplotlib.pyplot as plt
import numpy as np
import cv2
import os

size = 224 #resize图片的大小,运行时如果爆显存的话把这里调小即可

# get_data(Input_path,Label)
# 作用:读取Input_path里的图片,并给每张图打上自定义标签Label
def get_data(Input_path,Label): 
    Image_names=os.listdir(Input_path) #获取目录下所有图片名称列表
    data=np.zeros((len(Image_names),size*size*3)) #初始化一个np.array数组用于存数据,自己图片是n维的就把3改成n即可
    label=np.zeros((len(Image_names),1)) #初始化一个np.array数组用于存数据

    #为当前文件下所有图片分配自定义标签Label
    for k in range(len(Image_names)):
        label[k][0]=Label
        
    for i in range(len(Image_names)):
        image_path=os.path.join(Input_path,Image_names[i])
        img=cv2.imread(image_path)
        img=cv2.resize(img,(size,size)) #(size,size,3)
        img = img.flatten() #(3*size*size,)
        data[i]=img
    return data, label

#重点来了,这里是根据自己想查看的数据来自定义修改代码,得到自己的x_train和y_train
#x_train是待分析的数据
#y_train是待分析的自定义标签
#比如,我想分析训练集中5个类的分布情况
#先读取每一个类的数据,然后给他们自定义标签1-5
#然后把data拼在一起,label拼在一起,前者叫x_train,后者叫y_train
data1, label1 = get_data('../data_set/radar_oldANDyoung/train/1',1) #根据自己的路径合理更改
data2, label2 = get_data('../data_set/radar_oldANDyoung/train/2',2) 
data3, label3 = get_data('../data_set/radar_oldANDyoung/train/3',3) 
data4, label4 = get_data('../data_set/radar_oldANDyoung/train/4',4) 
data5, label5 = get_data('../data_set/radar_oldANDyoung/train/5',5) 
#得出数据后把他们拼起来
data = np.vstack((data1,data2,data3,data4,data5))
label = np.vstack((label1,label2,label3,label4,label5))

(x_train,y_train) = (data,label)
print(y_train.shape) #(n_samples,1)
print(x_train.shape) #(n_samples,size*size*3)

#t-SNE,输出结果是(n_samples,2)
#TSNE的参数和sklearn的T-SNE一样,不懂的自行查看即可
tsne = TSNE(n_iter=1000, verbose=1,num_neighbors=32,device=0)
tsne_results = tsne.fit_transform(x_train)

print(tsne_results.shape) #(n_samples,2)

# 画图
fig = plt.figure( figsize=(8,8) )
ax = fig.add_subplot(1, 1, 1, title='TSNE-radar' )

# Create the scatter
#ax.scatter()的用法自行百度
scatter  = ax.scatter(
    x=tsne_results[:,0],
    y=tsne_results[:,1],
    c=y_train,
    # cmap=plt.cm.get_cmap('Paired'),
    # alpha=0.4,
    s=10)

#ax.legend添加类标签
legend1 = ax.legend(*scatter.legend_elements(),loc="lower left", title="Classes")
ax.add_artist(legend1)

#显示图片
plt.show()
#保存图片
plt.savefig('./tSNE_radar.jpg')

本文转载自: https://blog.csdn.net/ts1637605540/article/details/125766434
版权归原作者 Nudge636 所有, 如有侵权,请联系我们删除。

“利用t-SNE可视化自己的数据集分布”的评论:

还没有评论