tensorflow2自定义训练 【这里包含了如何绘制训练过程中参数的变化append ,plot,如何绘制数据集scatter】

本文介绍了在TensorFlow2中自定义训练循环的方法,包括利用变量进行状态管理、计算梯度、定义模型、损失函数和训练数据。通过一个简单的模型示例,展示了如何通过optimizer调整变量以最小化损失。同时,文章还讨论了过拟合、有监督和无监督学习的概念,并解释了训练循环的工作原理,以及模型评估和预测的流程。
摘要由CSDN通过智能技术生成

1.Tensorflow中的tensor是不可变无状态对象.
机器学习模型需要可改变状态,比如模型训练和模型预测的代码是相同的,但变量值随着时间而不同(希望尽量小的loss),为了因对随着计算而改变的状态,可以利用Python的状态可变性。

2.Tensorflow,拥有内建可变状态操作,比使用底层Python状态表示更常见。
比如表示模型的权重,使用Tensorflow变量更方便高效。
变量是一个对象,这个对象存储着数值,当在Tensorflow计算中使用时,会隐式的读取这个存储的数值。
有一些操作(tf.assign_sub,tf.scatter_update等)会复制Tensorflow变量存储的数值。

3.计算梯度时,会自动跟踪使用变量的计算过程。
用变量来表示向量时TensorFlow会默认使用稀疏更新,这样可以带来计算和存储高效性。
使用变量也是一种更快的提醒方式,就是代码的这部分是状态可分的???

4.创建和训练一个简单的模型,一般需要下面这些步骤:
1.定义模型
2.定义损失函数
3.获取训练数据
4.通过训练数运行模型,使用“optimizer”来调整变量来满足数据
在这里插入图片描述

首先,需要安装一些必要的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库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值