pytorch实现自己的深度神经网络(公共数据集)

ops/2024/11/21 1:45:29/

一、训练文件——train.py

  注意:在运行此代码之前,需要配置好pytorch-GPU版本的环境,具体再次不谈。

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms# 检查GPU是否可用
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print("Device:", device)# 数据预处理的转换
transform = transforms.Compose([transforms.Resize((256, 256)),transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])# 加载CIFAR-10训练数据集
train_dataset = torchvision.datasets.CIFAR10(root='./data', train=True,download=True, transform=transform)# 创建数据加载器
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=8,shuffle=True, num_workers=0)# 定义神经网络模型
class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.conv1 = nn.Conv2d(3, 32, 3, padding=1)self.conv2 = nn.Conv2d(32, 64, 3, padding=1)self.conv3 = nn.Conv2d(64, 128, 3, padding=1)self.pool = nn.MaxPool2d(2, 2)self.fc1 = nn.Linear(128 * 32 * 32, 512)self.fc2 = nn.Linear(512, 10)def forward(self, x):x = self.pool(torch.relu(self.conv1(x)))x = self.pool(torch.relu(self.conv2(x)))x = self.pool(torch.relu(self.conv3(x)))x = x.view(-1, 128 * 32 * 32)x = torch.relu(self.fc1(x))x = self.fc2(x)return x# 实例化模型,并将其移动到可用设备上
model = CNN().to(device)# 定义损失函数
criterion = nn.CrossEntropyLoss()# 定义优化器
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)if __name__ == '__main__':# 训练神经网络for epoch in range(5):running_loss = 0.0for i, data in enumerate(train_loader, 0):inputs, labels = data[0].to(device), data[1].to(device)# 梯度清零optimizer.zero_grad()# 正向传播outputs = model(inputs)loss = criterion(outputs, labels)# 反向传播 + 优化loss.backward()optimizer.step()# 打印统计信息running_loss += loss.item()if i % 200 == 199:print('[%d, %5d] loss: %.3f' %(epoch + 1, i + 1, running_loss / 200))running_loss = 0.0print('Finished Training')# 保存模型至文件torch.save(model.state_dict(), 'cifar10_cnn_model.pth')

二、测试文件——val.py

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np
import cv2# 检查GPU是否可用
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print("Device:", device)# 数据预处理的转换
transform = transforms.Compose([transforms.Resize((256, 256)),transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])# 加载CIFAR-10测试数据集
test_dataset = torchvision.datasets.CIFAR10(root='./data', train=False,download=True, transform=transform)# 创建测试数据加载器
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=8,shuffle=False, num_workers=0)# 加载模型并将其移动到可用设备上
class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.conv1 = nn.Conv2d(3, 32, 3, padding=1)self.conv2 = nn.Conv2d(32, 64, 3, padding=1)self.conv3 = nn.Conv2d(64, 128, 3, padding=1)self.pool = nn.MaxPool2d(2, 2)self.fc1 = nn.Linear(128 * 32 * 32, 512)self.fc2 = nn.Linear(512, 10)def forward(self, x):x = self.pool(torch.relu(self.conv1(x)))x = self.pool(torch.relu(self.conv2(x)))x = self.pool(torch.relu(self.conv3(x)))x = x.view(-1, 128 * 32 * 32)x = torch.relu(self.fc1(x))x = self.fc2(x)return x
# 显示函数
def imshow(img):img = img / 2 + 0.5npimg = img.numpy()# 坐标转换plt.imshow(np.transpose(npimg, (1, 2, 0)))plt.show()model = CNN().to(device)
model.load_state_dict(torch.load('cifar10_cnn_model.pth'))
model.eval()if __name__ == '__main__':# 在测试集上测试模型correct = 0total = 0with torch.no_grad():for data in test_loader:images, labels = data[0].to(device), data[1].to(device)outputs = model(images)# 预测值的最大值以及最大值的类别索引_, predicted = torch.max(outputs, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print('Accuracy on the test images: %d %%' % (100 * correct / total))# 显示测试集中的一些图片及其预测结果# 生成一个迭代器,从数据加载器中取出数据dataiter = iter(test_loader)# 从迭代器中获取下一个批次的数据images, labels = dataiter.next()# 将获取到的批次数据移动到device上,在这里也就是GPU上images, labels = images.to(device), labels.to(device)dip_flag = Falseif dip_flag == True:# -------------------------------------------# 可以选择 使用opencv显示# -------------------------------------------np_images = images.cpu().numpy()# 循环遍历并显示所有测试集图片for i in range(len(np_images)):# 从归一化中还原图像数据np_image = np.transpose(np_images[i], (1, 2, 0))   # 从CHW转换为HWCnp_image = np_image * 0.5 + 0.5# 将图像数据从float类型转换为unit8类型np_image = (np_image * 255).astype(np.uint8)# 使用opencv显示图像cv2.imshow("Image {}".format(i+1), np_image)cv2.waitKey(0)# 等待用户按下任意键继续显示下一张图像cv2.destroyAllWindows()imshow(torchvision.utils.make_grid(images.cpu()))print('GroundTruth: ', ' '.join('%5s' % test_dataset.classes[labels[j]] for j in range(8)))outputs = model(images)_, predicted = torch.max(outputs, 1)print('Predicted: ', ' '.join('%5s' % test_dataset.classes[predicted[j]]for j in range(8)))


直接运行即可,亲测可以运行


http://www.ppmy.cn/ops/4310.html

相关文章

MariaDB 10.5,MySQL乱码问题,设置字符编码UTF8

目录 场景介绍 具体的解决方法 idea设置编码 修改navicate中创建数据库的编码格式 修改MariaDB 10.5,MySQL的my.ini文件 MariaDB 10.5 MySQL找到路径点开,打开my.ini文件 场景介绍 在网页修改,或者提交数据时候,中文将会变…

如何使用ArcGIS Pro进行路径分析

路径分析是一种空间分析技术,用于确定两个或多个地点之间最佳路径或最短路径,这里为大家介绍一下在ArcGIS Pro中如何进行路径分析,希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的道路数据,除了道路数据&a…

MLOps

参考: 什么是MLOps?与DevOps有何异同?有什么价值?https://baijiahao.baidu.com/s?id1765071998288593530&wfrspider&forpcMLOps简介_AI开发平台ModelArts_WorkflowMLOps(Machine Learning Operation)是机器学习&#xf…

Oracle查询字段所属表及其应用场景详解

Oracle查询字段所属表及其应用场景详解 引言应用场景一:在已知模式下的简单查找应用场景二:跨模式搜索应用场景三:根据表注释或字段注释定位应用场景四:关联表查询结论注意事项 引言 在复杂的数据库环境中,尤其是在拥有…

PSCAD|应用于输电线路故障测距的行波波速仿真分析

1 主要内容 该程序参考文献《应用于输电线路故障测距的行波波速仿真分析》,利用线路内部故障产生的初始行波浪涌达线路两端测量点的绝对时间之差值计算故障点到两端测量点之间的距离,并利用小波变换得到初始行波波头准确到达时刻,从而精准定…

Adobe发布Acrobat AI助手,PDF互动新体验;OpenAI推出Batch批处理API,支持半价优惠

🦉 AI新闻 🚀 Adobe发布Acrobat AI助手,PDF互动新体验 摘要:Adobe公司近日宣布,继2月推出测试版后,Acrobat AI 助手已在Acrobat Reader、桌面和网页上全面推出。以每月4.99美元的附加订阅形式提供&#x…

危险场景智能运维巡检系统

在石油、天然气、煤炭和化工等行业,特别是在I/IIC级防爆区场景中,存在着诸如易燃、易爆、高温、有毒有害以及粉尘等危险因素。例如,油气转运站、催化裂化装置、煤化工甲醇车间以及制氢站等地点,都面临着这些潜在的危险。传统的人工…

CentOS常见命令

以下是一些常见的CentOS命令: 管理文件和目录: ls:列出目录中的文件和子目录。cd:切换目录。mkdir:创建一个新的目录。rm:删除文件或目录。cp:复制文件或目录。mv:移动或重命名文件…