基于pytorch的自定义图像数据集mmd域对齐并绘制混淆矩阵散点图可视化

时间: 2023-08-18 21:05:03 浏览: 46
首先,需要安装一些必要的Python库,包括pytorch、numpy、sklearn、matplotlib等。然后,按照以下步骤进行自定义图像数据集的mmd域对齐和混淆矩阵散点图可视化: 1. 加载数据集 首先,需要将自定义数据集加载到PyTorch中,可以使用torchvision中的ImageFolder函数,该函数可以将指定路径下的图像文件夹自动转换为PyTorch数据集对象。 ```python import torchvision.datasets as dset import torchvision.transforms as transforms # 定义数据预处理 transform = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) # 加载数据集 train_dataset = dset.ImageFolder(root='path/to/train/dataset', transform=transform) test_dataset = dset.ImageFolder(root='path/to/test/dataset', transform=transform) ``` 2. 训练模型 接下来,需要训练一个图像分类模型,这里我们选择ResNet18作为基础模型。这里以训练train_dataset为例,实现代码如下: ```python import torch import torch.nn as nn import torch.optim as optim import torchvision.models as models # 定义模型 model = models.resnet18(pretrained=True) num_ftrs = model.fc.in_features model.fc = nn.Linear(num_ftrs, len(train_dataset.classes)) # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9) # 训练模型 for epoch in range(num_epochs): running_loss = 0.0 for i, data in enumerate(train_loader, 0): inputs, labels = data optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print('Epoch %d loss: %.3f' % (epoch+1, running_loss/len(train_loader))) ``` 3. 计算mmd距离 接下来,需要计算训练集和测试集之间的mmd距离,以保证在不同域之间的分类效果。这里使用pytorch-mmd库来计算mmd距离。 ```python !pip install pytorch-mmd import mmd import numpy as np # 计算mmd距离 train_features = [] test_features = [] model.eval() with torch.no_grad(): for data in train_loader: inputs, _ = data features = model.features(inputs).view(inputs.size(0), -1).numpy() train_features.append(features) for data in test_loader: inputs, _ = data features = model.features(inputs).view(inputs.size(0), -1).numpy() test_features.append(features) train_features = np.concatenate(train_features, axis=0) test_features = np.concatenate(test_features, axis=0) mmd_distance = mmd.linear_mmd2_kernel(X=train_features, Y=test_features) ``` 4. 绘制混淆矩阵散点图 最后,我们可以使用sklearn和matplotlib库来绘制混淆矩阵散点图,以可视化模型在不同域之间的分类效果。 ```python from sklearn.metrics import confusion_matrix import matplotlib.pyplot as plt # 预测测试集 model.eval() y_pred = [] y_true = [] with torch.no_grad(): for data in test_loader: inputs, labels = data outputs = model(inputs) _, predicted = torch.max(outputs, 1) y_pred.extend(predicted.numpy()) y_true.extend(labels.numpy()) # 绘制混淆矩阵散点图 cm = confusion_matrix(y_true, y_pred) plt.scatter(train_features[:, 0], train_features[:, 1], c=y_train, cmap='viridis', alpha=0.5) plt.scatter(test_features[:, 0], test_features[:, 1], c=y_test, cmap='viridis', marker='x', alpha=0.5) plt.title('Confusion Matrix Scatter Plot') plt.xlabel('Feature 1') plt.ylabel('Feature 2') plt.show() ``` 完整代码如下: ```python import torchvision.datasets as dset import torchvision.transforms as transforms import torch.nn as nn import torch.optim as optim import torchvision.models as models import torch import numpy as np import mmd from sklearn.metrics import confusion_matrix import matplotlib.pyplot as plt # 定义数据预处理 transform = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) # 加载数据集 train_dataset = dset.ImageFolder(root='path/to/train/dataset', transform=transform) test_dataset = dset.ImageFolder(root='path/to/test/dataset', transform=transform) # 定义模型 model = models.resnet18(pretrained=True) num_ftrs = model.fc.in_features model.fc = nn.Linear(num_ftrs, len(train_dataset.classes)) # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9) # 训练模型 num_epochs = 10 train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True) test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=32, shuffle=True) for epoch in range(num_epochs): running_loss = 0.0 for i, data in enumerate(train_loader, 0): inputs, labels = data optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print('Epoch %d loss: %.3f' % (epoch+1, running_loss/len(train_loader))) # 计算mmd距离 train_features = [] test_features = [] model.eval() with torch.no_grad(): for data in train_loader: inputs, _ = data features = model.features(inputs).view(inputs.size(0), -1).numpy() train_features.append(features) for data in test_loader: inputs, _ = data features = model.features(inputs).view(inputs.size(0), -1).numpy() test_features.append(features) train_features = np.concatenate(train_features, axis=0) test_features = np.concatenate(test_features, axis=0) mmd_distance = mmd.linear_mmd2_kernel(X=train_features, Y=test_features) # 预测测试集 model.eval() y_pred = [] y_true = [] with torch.no_grad(): for data in test_loader: inputs, labels = data outputs = model(inputs) _, predicted = torch.max(outputs, 1) y_pred.extend(predicted.numpy()) y_true.extend(labels.numpy()) # 绘制混淆矩阵散点图 cm = confusion_matrix(y_true, y_pred) plt.scatter(train_features[:, 0], train_features[:, 1], c=y_train, cmap='viridis', alpha=0.5) plt.scatter(test_features[:, 0], test_features[:, 1], c=y_test, cmap='viridis', marker='x', alpha=0.5) plt.title('Confusion Matrix Scatter Plot') plt.xlabel('Feature 1') plt.ylabel('Feature 2') plt.show() ``` 需要注意的是,在上述代码中,需要将“path/to/train/dataset”和“path/to/test/dataset”替换为自己的数据集路径。另外,在计算mmd距离时,需要安装pytorch-mmd库。

相关推荐

最新推荐

recommend-type

pytorch实现mnist数据集的图像可视化及保存

今天小编就为大家分享一篇pytorch实现mnist数据集的图像可视化及保存,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

pytorch学习教程之自定义数据集

自定义数据集 在训练深度学习模型之前,样本集的制作非常重要。在pytorch中,提供了一些接口和类,方便我们定义自己的数据集合,下面完整的试验自定义样本集的整个流程。 开发环境 Ubuntu 18.04 pytorch 1.0 ...
recommend-type

pytorch 语义分割-医学图像-脑肿瘤数据集的载入模块

由于最近目标是完成基于深度学习的脑肿瘤语义分割实验,所以需要用到自定义的数据载入,本文参考了一下博客:https://blog.csdn.net/tuiqdymy/article/details/84779716?utm_source=app,一开始是做的眼底图像分割,...
recommend-type

Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式

今天小编就为大家分享一篇Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

使用pytorch实现可视化中间层的结果

今天小编就为大家分享一篇使用pytorch实现可视化中间层的结果,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解释minorization-maximization (MM) algorithm,并给出matlab代码编写的例子

Minorization-maximization (MM) algorithm是一种常用的优化算法,用于求解非凸问题或含有约束的优化问题。该算法的基本思想是通过构造一个凸下界函数来逼近原问题,然后通过求解凸下界函数的最优解来逼近原问题的最优解。具体步骤如下: 1. 初始化参数 $\theta_0$,设 $k=0$; 2. 构造一个凸下界函数 $Q(\theta|\theta_k)$,使其满足 $Q(\theta_k|\theta_k)=f(\theta_k)$; 3. 求解 $Q(\theta|\theta_k)$ 的最优值 $\theta_{k+1}=\arg\min_\theta Q(
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。