视觉分类任务中可视化工具 t-SNE

视觉分类任务中可视化工具 t-SNE

主代码

import cv2
import time
import numpy as np
from pathlib import Path
from datetime import datetime
import matplotlib.pyplot as plt

import torch
import torchvision
from torchvision import datasets, transforms

from sklearn import preprocessing
from sklearn.manifold import TSNE

from models.dual_tSNE import Model


class Config:
    image_resize = 256
    image_crop = 224
    batch_size = 32                 # 64 for MIT-Indoor, 128 for others
    backbone = "resnet50"           # vgg19 resnet18 resnet50 resnet101 densenet161
    dataset_name = "dtd_t-SNE"     #  "FMD" "dtd-r1.0.1" "4D_Light" "MIT-Indoor"
    data_dir = Path(f"data/{dataset_name}/splits/split_1")
    output_dir = Path(f"outputs/confusion_matrix")
    checkpoint = "outputs/resnet50_dtd-tsne_epoch42_0.8608.pth.tar"

DataTransforms = {
    'train': transforms.Compose([
        transforms.RandomResizedCrop(Config.image_crop),
        transforms.RandomHorizontalFlip(),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),
        ]),
    'test' : transforms.Compose([
        transforms.Resize(Config.image_resize),
        transforms.CenterCrop(Config.image_crop),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ])
}


# function for training model
def inference(model, dataloaders):
    since = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    features_list = []
    predict_list = []
    lable_list = []

    # for phase in ['train', 'test']:
    t1 = time.time()
    for phase in ['test']:
        model.eval()   # Set model to evaluate mode

        # Iterate over data.
        running_corrects = 0
        i = 0
        for inputs, labels in dataloaders[phase]:
            inputs = inputs.to(device)
            labels = labels.to(device)

            # forward
            features, outputs = model(inputs)
            _, preds = torch.max(outputs, 1)

            # statistics
            running_corrects += torch.sum(preds == labels.data)
            predict_list.extend(list(preds.cpu().numpy()))
            lable_list.extend(list(labels.data.cpu().numpy()))
            features_list.append(features)

        accuracy = running_corrects.double() / len(dataloaders[phase].dataset)
        print('{} : Acc = {:.4f}'.format(phase, accuracy))

    t2 = time.time()
    print('-' * 35)
    print(f'Start Time : {since}')
    print(f'End Time : {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}')
    print(f'Inference Time : {(t2-t1)/60:.4f} minute  ({(t2-t1):.4f}s)')
    print('=' * 39, '\n')

    return accuracy, features_list, predict_list, lable_list


def t_SNE(X, y, class_names):
    # t-SNE降维处理
    tsne = TSNE(n_components=2,
                verbose=1,
                n_iter=5000,
                random_state=0)
    # tsne = TSNE(
    #     n_components=2,
    #     init="pca",
    #     learning_rate="auto",
    #     n_iter=500,
    #     n_iter_without_progress=150,
    #     n_jobs=2,
    #     random_state=0,
    # )
    result = tsne.fit_transform(X)

    # 归一化处理
    scaler = preprocessing.MinMaxScaler(feature_range=(-100,100))
    scaler = preprocessing.MinMaxScaler()
    result = scaler.fit_transform(result)

    # 颜色设置
    color = ['#DC143C', '#FF0000', '#FFA07A', '#FFB6C1', '#FF69B4',
             '#FF1493', '#FF7F50', '#FFD700', '#FFFF00', '#FFDAB9',
             '#D2691E', '#B8860B', '#800000', '#9400D3', '#836FFF',
             '#FF00FF', '#DDA0DD', '#808000', '#A2CD5A', '#00FF00',
             '#228B22', '#20B2AA', '#00FFFF', '#00BFFF', '#1E90FF',
             '#0000CD', '#000000', '#808080', '#778899', '#DCDCDC']

    # 可视化展示, 加图例
    # plt.figure(figsize=(30, 30))
    plt.title('t-SNE process')
    legend_dict = {}
    for i in range(len(result)):
        sh = plt.scatter(result[i,0], result[i,1], c=color[y[i]], s=50)
        if class_names[y[i]] not in legend_dict.keys():
            legend_dict[class_names[y[i]]] = sh
    legend_dict = dict(sorted(legend_dict.items(), key = lambda x:x[0]))
    plt.legend(legend_dict.values(), legend_dict.keys(), loc=(1.04901,0.1))
    plt.show()



# prepare dataset
image_datasets = {x: datasets.ImageFolder(Config.data_dir / x,
                    transform=DataTransforms[x]) for x in ['train', 'test']}
dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'test']}
dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x],
                  batch_size=Config.batch_size, shuffle=True, num_workers=4)
                  for x in ['train', 'test']}
class_names = image_datasets['train'].classes

# prepare net and load checkpoint
net = Model(Config.backbone, len(class_names))
net.load_state_dict(torch.load(Config.checkpoint)["state_dict"])

# assign device
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model_ft = net.to(device)

accuracy, features_list, predict_list, lable_list = inference(model_ft, dataloaders)
predicts = np.array(predict_list)
lables = np.array(lable_list)
features = np.concatenate(features_list)
print(type(predicts), predicts.shape)
print(type(lables), lables.shape)
print(type(features), features.shape)

t_SNE(features, lables, class_names)

网络模型代码

import torch
import torch.nn as nn
from torchvision import models
from torchstat import stat
from torchsummary import summary

class Model(nn.Module):
    def __init__(self, backbone, num_classes, dropout_ratio=0.6):
        super(Model,self).__init__()

        assert backbone in ["vgg19", "resnet18", "resnet50", "resnet101", "densenet161"]
        self.backbone = eval(f"models.{backbone}")(pretrained=True)
        self.layer1 = nn.Conv2d(in_channels=feature_dim_1, out_channels=feature_dim_1, kernel_size=1, stride=1, padding=0)
        self.layer2 = nn.Conv2d(in_channels=feature_dim_1, out_channels=feature_dim_1, kernel_size=1, stride=1, padding=0)
        self.classifier = nn.Linear((feature_dim_1+feature_dim_2), num_classes)

    def forward(self,x):
        out1 = self.backbone(x)     
        out1 = self.layer1(out1)  
        out = self.layer2(out1)  
        x = self.classifier(out)

        return out.detach().cpu().numpy(), x
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: PyTorch 是一种广泛使用的深度学习框架,用于神经网络模型的构建和训练。而 t-SNE(t-distributed stochastic neighbor embedding)是一种常用的降维和数据可方法。在 PyTorch ,可以使用 t-SNE 对模型的特征进行可t-SNE 可以将高维特征空间的数据映射到二维或三维空间,使得数据在可上更容易理解。在 PyTorch ,通过提取模型的特定层的输出,我们可以获得特征向量。然后,使用 t-SNE 将这些特征向量映射到低维空间。 首先,从模型选择一个合适的层作为特征提取器。一般来说,选择间的某一层作为特征提取器,以便获取模型学到的抽象特征。然后,将待可的数据输入模型进行前向传播,获取特定层的输出。 接下来,使用 t-SNE 算法对这些特征进行降维。t-SNE 在计算考虑样本之间的相似度,将高维特征映射到低维空间,以保留样本间的相对距离。PyTorch 提供了一些实现 t-SNE 算法的库,比如 sklearn t-SNE。 最后,通过绘制降维后的特征向量,可以在二维或三维空间数据。可以使用散点图或其他合适的可方法展示数据。通过观察可结果,可以更好地理解数据的分布和特征之间的关系。 总结来说,使用 PyTorch 和 t-SNE,我们可以将模型的特征可,从而更好地理解数据的结构和模型的学习情况。这可以帮助我们分析模型的性能,优特征选择,以及在数据挖掘和机器学习任务做出更准确的决策。 ### 回答2: T-SNE是一种降维和可的算法,可用于将高维特征映射到二维或三维空间,以便更好地理解和分析数据。 在PyTorch,我们可以使用T-SNE对特征进行可。首先,我们需要获取模型的特征。通过提取间层的输出,我们可以获得具有较低维度的特征向量。 接下来,我们使用T-SNE算法将这些特征向量映射到二维平面。PyTorch提供了许多实现T-SNE的库,如scikit-learn或TSNE库。 然后,我们可以使用matplotlib等库将特征可。可以使用不同的颜色或符号表示不同的类别或类别之间的差异。 特征可可以帮助我们理解数据之间的关系,发现数据的模式或异常,并为进一步的分析提供指导。例如,我们可以根据特征可的结果进行聚类或分类任务。 需要注意的是,T-SNE是一种非确定性算法,因此对于不同的运行,可能会导致稍微不同的结果。因此,在进行分析和解释时,应该综合考虑多次运行的结果。 总之,通过PyTorch和T-SNE,我们可以将高维特征映射到二维空间,并使用可来更好地理解和分析数据,辅助我们在机器学习或数据分析的工作。 ### 回答3: PyTorch是一个流行的开源深度学习框架,而t-SNE则是一种常用的降维和可算法。 特征可是指将高维数据的特征表示转为低维空间,并通过可工具将其呈现出来,以便更好地理解数据。 在PyTorch,我们可以使用t-SNE算法对提取的特征进行降维和可。首先,我们使用预训练的深度学习模型,如卷积神经网络(CNN),提取数据集每个样本的特征表示。接下来,我们将这些特征输入到t-SNE算法,通过迭代计算寻找合适的低维表示。 在PyTorch实现t-SNE的方法有很多,可以使用sklearn库t-SNE算法,或者使用开源的tsne库。这些库都提供了简单易用的接口,可以方便地将特征数据作为输入,得到相应的低维投影结果。 一旦得到了特征的低维表示,我们可以使用各种可工具(如Matplotlib或Plotly)来展示这些特征点的分布。例如,我们可以使用散点图将不同类别的特征点呈现在二维平面上,或者使用颜色和形状来表示不同的类别信息。通过可,我们可以更好地理解数据的分布情况,发现不同类别之间的关系,甚至发现异常点或噪声。 总之,PyTorch提供了强大的深度学习框架,而t-SNE算法则是特征可的一种常用工具。通过将两者结合使用,我们可以更好地理解数据的特征表示,从而为模型训练和数据分析提供更多的洞察。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值