当前位置: 首页 > news >正文

pytorch神经网络入门代码

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms# 定义神经网络结构
class SimpleNN(nn.Module):def __init__(self, input_size, hidden_size, num_classes):super(SimpleNN, self).__init__()self.fc1 = nn.Linear(input_size, hidden_size)self.relu = nn.ReLU()self.fc2 = nn.Linear(hidden_size, num_classes)def forward(self, x):out = self.fc1(x)out = self.relu(out)out = self.fc2(out)return out# 设置超参数
input_size = 784  # MNIST数据集的输入大小是28x28=784
hidden_size = 784
num_classes = 10learning_rate = 0.01
num_epochs = 10# 加载MNIST数据集
train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=transforms.ToTensor())# 数据加载器
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=100, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=100, shuffle=False)# 实例化模型
model = SimpleNN(input_size, hidden_size, num_classes)# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=learning_rate)# 训练模型
total_step = len(train_loader)
for epoch in range(num_epochs):for i, (images, labels) in enumerate(train_loader):# 将输入数据转换为一维向量images = images.reshape(-1, 28*28)# 前向传播outputs = model(images)loss = criterion(outputs, labels)# 反向传播和优化optimizer.zero_grad()loss.backward()optimizer.step()if (i+1) % 100 == 0:print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, i+1, total_step, loss.item()))# 测试模型
with torch.no_grad():correct = 0total = 0for images, labels in test_loader:images = images.reshape(-1, 28*28)outputs = model(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: {} %'.format(100 * correct / total))# 获取模型参数
params = model.parameters()# 打印每个参数的名称和值
for name, param in model.named_parameters():print(f'Parameter name: {name}')print(f'Parameter value: {param}')

以下代码测试正确率为:99.37%

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms# 定义适合MNIST数据集的CNN模型
class MNISTCNN(nn.Module):def __init__(self):super(MNISTCNN, self).__init__()# 卷积块 1self.conv_block1 = nn.Sequential(nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, padding=1),nn.ReLU(),nn.MaxPool2d(kernel_size=2))# 卷积块 2self.conv_block2 = nn.Sequential(nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, padding=1),nn.ReLU(),nn.MaxPool2d(kernel_size=2))# 全连接层self.fc_layer = nn.Sequential(nn.Linear(64 * 7 * 7, 512),  # 假设经过前面的卷积和池化后特征图大小为7x7nn.ReLU(),nn.Dropout(p=0.5),nn.Linear(512, 10)  # MNIST有10个类别)def forward(self, x):x = self.conv_block1(x)x = self.conv_block2(x)# 将卷积层输出展平为一维向量x = x.view(x.size(0), -1)# 通过全连接层x = self.fc_layer(x)return x# 创建模型实例
model = MNISTCNN()# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 加载MNIST数据集并预处理
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)# 使用DataLoader加载批量数据
batch_size = 64
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=False)# 开始训练
num_epochs = 10
for epoch in range(num_epochs):for inputs, labels in train_loader:# 前向传播outputs = model(inputs)loss = criterion(outputs, labels)# 反向传播和优化optimizer.zero_grad()  # 清空梯度缓存loss.backward()  # 计算梯度optimizer.step()  # 更新参数# 每个epoch结束时打印损失print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')# 测试模型
model.eval()  # 将模型切换到评估模式(禁用Dropout和BatchNorm等)
with torch.no_grad():correct = 0total = 0for images, labels in test_loader:outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f'Test Accuracy: {100 * correct / total}%')

相关文章:

  • 最优字符串分隔符:零宽度空格和字符
  • 从宏观到微观——泽攸科技ZEM系列台式扫描电子显微镜在岩石分析中的应用
  • SpringBoot常见问题
  • firewall防火墙配置实战
  • 宝塔nginx配置SpringBoot服务集群代理
  • 【教程】autojs使用Intent打开相机拍照并指定存储路径
  • virtualbox虚拟机运行中断,启动报错“获取 VirtualBox COM 对象失败”
  • element 表单提交图片(表单上传图片)
  • 扫盲:什么是webGPU,和webGL对比哪些优点?
  • Java——Stream流的学习
  • 分享一个学英语的网站
  • 若依不分离版本部署流程
  • 【工作记录】基于docker+mysql部署单机版nacos2.0.4@20240219
  • 淘宝商品采集API通过商品id获取商品详情信息
  • 网络安全-一句话木马
  • 2019年如何成为全栈工程师?
  • JAVA 学习IO流
  • 成为一名优秀的Developer的书单
  • 力扣(LeetCode)965
  • 延迟脚本的方式
  • 一个项目push到多个远程Git仓库
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • $$$$GB2312-80区位编码表$$$$
  • (2)nginx 安装、启停
  • (C)一些题4
  • (libusb) usb口自动刷新
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (规划)24届春招和25届暑假实习路线准备规划
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (转)树状数组
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .net 7 上传文件踩坑
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .Net 路由处理厉害了
  • .NET 中创建支持集合初始化器的类型
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • ?
  • [CERC2017]Cumulative Code
  • [Django 0-1] Core.Checks 模块
  • [Editor]Unity Editor类常用方法
  • [Foreman]解决Unable to find internal system admin account
  • [idea]关于idea开发乱码的配置
  • [ios-必看] IOS调试技巧:当程序崩溃的时候怎么办 iphone IOS
  • [JavaWeb]—前端篇
  • [Kubernetes]9. K8s ingress讲解借助ingress配置http,https访问k8s集群应用
  • [LeeCode]—Wildcard Matching 通配符匹配问题
  • [MAT]使用MAT比較多个heap dump文件
  • [Oh My C++ Diary]结构体变量的声明
  • [Python] 递归返回值 为 None 的问题
  • [Silverlight]通过MVVM模式实现本地化/全球化(1)
  • [SPOJ]COT2