自己做实验时想看一看自己数据集的分布,在网上找了一圈发现大家都是用的降维的方式查看,比较火的有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')