Pytorch自定义中心损失函数与交叉熵函数进行[手写数据集识别],并进行对比

news/2024/11/7 22:43:36/

加上中心损失函数

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from torchvision import datasets, transforms# 设置随机种子,确保实验可重复性
torch.manual_seed(42)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False# 检查GPU是否可用
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print('Using device:', device)# 定义数据预处理
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))
])# 加载数据集
trainset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
trainloader = DataLoader(trainset, batch_size=4, shuffle=True)
testset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)
testloader = DataLoader(testset, batch_size=4, shuffle=False)# 定义模型
class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(1, 32, kernel_size=5, padding=2)self.pool1 = nn.MaxPool2d(kernel_size=2)self.conv2 = nn.Conv2d(32, 64, kernel_size=5, padding=2)self.pool2 = nn.MaxPool2d(kernel_size=2)self.fc1 = nn.Linear(7*7*64, 64)self.fc2 = nn.Linear(64, 10)self.relu = nn.ReLU(inplace=True)self.centers = nn.Parameter(torch.randn(10, 64))def forward(self, x):x = self.pool1(self.relu(self.conv1(x)))x = self.pool2(self.relu(self.conv2(x)))x = x.view(-1, 7*7*64)features = self.relu(self.fc1(x))centers = self.centersbatch_size = features.size(0)centers_batch = centers[labels]distance = features.unsqueeze(1) - centers_batch.unsqueeze(0)distance = distance.pow(2).sum(dim=2) / 2.0 / 1.0loss_center = distance.mean()logits = self.fc2(features)return logits, loss_center# 实例化模型和优化器
net = Net().to(device)
#net = nn.DataParallel(net.cuda(), device_ids=0,1, output_device=gpus[0])
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)# 训练模型
num_epochs = 10
for epoch in range(num_epochs):running_loss = 0.0for i, data in enumerate(trainloader, 0):inputs, labels = data[0].to(device), data[1].to(device)optimizer.zero_grad()outputs, loss_center = net(inputs)loss_cls = criterion(outputs, labels)loss = loss_cls + 0.1 * loss_centerloss.backward()optimizer.step()running_loss += loss.item()print('Epoch [%d/%d], Loss: %.4f' % (epoch+1, num_epochs, running_loss/(i+1)))# 测试模型
correct = 0
total = 0
with torch.no_grad():for data in testloader:images, labels = data[0].to(device), data[1].to(device)outputs, _ = net(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print('Accuracy of the network on the 10000 test images: %d %%' % (100 * correct / total))

Output
Using device: cuda
Epoch [1/10], Loss: 1.3335
Epoch [2/10], Loss: 0.2295
Epoch [3/10], Loss: 0.1399
Epoch [4/10], Loss: 0.1127
Epoch [5/10], Loss: 0.0963
Epoch [6/10], Loss: 0.0848
Epoch [7/10], Loss: 0.0764
Epoch [8/10], Loss: 0.0702
Epoch [9/10], Loss: 0.0651
Epoch [10/10], Loss: 0.0612
Accuracy of the network on the 10000 test images: 99 %

不加中心损失函数

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from torchvision import datasets, transforms# 设置随机种子,确保实验可重复性
torch.manual_seed(42)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False# 检查GPU是否可用
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print('Using device:', device)# 定义数据预处理
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))
])# 加载数据集
trainset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
trainloader = DataLoader(trainset, batch_size=4, shuffle=True)
testset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)
testloader = DataLoader(testset, batch_size=4, shuffle=False)# 定义模型
class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(1, 32, kernel_size=5, padding=2)self.pool1 = nn.MaxPool2d(kernel_size=2)self.conv2 = nn.Conv2d(32, 64, kernel_size=5, padding=2)self.pool2 = nn.MaxPool2d(kernel_size=2)self.fc1 = nn.Linear(7*7*64, 64)self.fc2 = nn.Linear(64, 10)self.relu = nn.ReLU(inplace=True)#self.centers = nn.Parameter(torch.randn(10, 64))def forward(self, x):x = self.pool1(self.relu(self.conv1(x)))x = self.pool2(self.relu(self.conv2(x)))x = x.view(-1, 7*7*64)features = self.relu(self.fc1(x))#centers = self.centers#batch_size = features.size(0)#centers_batch = centers[labels]#distance = features.unsqueeze(1) - centers_batch.unsqueeze(0)#distance = distance.pow(2).sum(dim=2) / 2.0 / 1.0#loss_center = distance.mean()logits = self.fc2(features)return logits# 实例化模型和优化器
net = Net().to(device)
#net = nn.DataParallel(net.cuda(), device_ids=0,1, output_device=gpus[0])
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)# 训练模型
num_epochs = 10
for epoch in range(num_epochs):running_loss = 0.0for i, data in enumerate(trainloader, 0):inputs, labels = data[0].to(device), data[1].to(device)optimizer.zero_grad()outputs = net(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()print('Epoch [%d/%d], Loss: %.4f' % (epoch+1, num_epochs, running_loss/(i+1)))# 测试模型
correct = 0
total = 0
with torch.no_grad():for data in testloader:images, labels = data[0].to(device), data[1].to(device)outputs, _ = net(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print('Accuracy of the network on the 10000 test images: %d %%' % (100 * correct / total))

Using device: cuda
Epoch [1/10], Loss: 0.1296
Epoch [2/10], Loss: 0.0405
Epoch [3/10], Loss: 0.0301
Epoch [4/10], Loss: 0.0210
Epoch [5/10], Loss: 0.0157
Epoch [6/10], Loss: 0.0116
Epoch [7/10], Loss: 0.0078
Epoch [8/10], Loss: 0.0061
Epoch [9/10], Loss: 0.0046
Epoch [10/10], Loss: 0.0045
Accuracy of the network on the 10000 test images: 99 %


http://www.ppmy.cn/news/40592.html

相关文章

【Qt笔记】4.文本编辑的简单使用

文章目录1 概述2 QLineEdit3 QTextEdit4 QPlainTextEdit1 概述 QT中的文本编辑类常用的有三种, 1.QLineEdit:单行普通文本2.QTextEdit:多行富文本3.QPlainTextEdit:多行普通文本 富文本指的是多文本格式。可以编辑图片和媒体相…

蚁群算法 | 运筹优化

1、原理 蚁群算法是由自然界中蚂蚁觅食的行为而启发的。在自然界中,蚂蚁觅食过程中,蚁群总能够寻找到一条从蚁巢到食物源的最优路径。信息素是蚂蚁之间交流的工具之一,当有蚂蚁走过时,它将会在它行进的路上释放出信息素&#xff…

第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组思考+总结

第十三届蓝桥杯大赛软件赛省赛 C/C 大学 B 组思考总结 公告 第十三届蓝桥杯大赛软件赛省赛 C/C 大学 B 组 C题 刷题统计 D题 修剪灌木 E题 X进制减法 F题 统计子矩阵 G题 积木画 H题 扫雷 I题 李白打酒加强版 J题 砍竹子 注意事项:1. 对于编程题目&#xff…

微软将 Exchange Online CAR 的弃用推迟到 2024 年

微软在 4 月 8 日宣布,Exchange Online 中的客户端访问规则 (CAR) 弃用将推迟一年,直到 2024 年 9 月。 Microsoft 365 管理员可以利用包含优先级值、异常、操作和条件的 CAR,使用各种因素过滤客户端对 Exchange Online 的访问。 这些因素包…

AI时代来临,如何把握住文档处理及数据分析的机遇

AI时代来临,如何把握住文档处理及数据分析的机遇前言一、生成式人工智能与元宇宙二、面向图像文档的复杂结构建模研究三、大型语言模型的关键技术和实现ChatGPT 介绍ChatGPT的三个关键技术四、ChatGPT与文档处理未来总结前言 在3月18日,由中国图象图形协…

【蓝桥杯冲刺】日期类专题特训

目录 1. 日期累加 题目描述 输入 输出 代码 2. 日期差值 题目描述 输入 输出 代码 3. 打印日期 题目描述 输入 输出 代码 写在最后: 1. 日期累加 题目链接:日期累加 题目描述 输入 1 2008 2 3 100 输出 2008-05-13 代码 #include…

redis性能优化

Redis 是基于单线程模型实现的,也就是 Redis 是使用一个线程来处理所有的客户端请求的,尽管 Redis 使用了非阻塞式 IO,并且对各种命令都做了优化(大部分命令操作时间复杂度都是 O(1)),但由于 Redis 是单线程…

macOS升级到Ventura 后vscode远程开发ssh链接失败

背景 最近公司IT让升级到mac系统,说之前的老版本太久了,因此要被迫升级macOS系统,这是一次重大升级,升级之后加大了和apple其他设备的互通性,升级完成之后确实和iOS更像了。不过我升级后发现我的vscode连不上开发机了…