精品资源共享课网站建设,新浪博客,网页应用生成器,wordpress图片分页插件简介
现在主流有两个框架pytorch和TensorFlow,本文主要介绍pytorch
PyTorch#xff1a;由 Facebook 的人工智能研究小组开发和维护。PyTorch 以其动态计算图#xff08;Dynamic Computational Graph#xff09;和易用性著称#xff0c;非常适合研究人员和开发者进行实验和…简介
现在主流有两个框架pytorch和TensorFlow,本文主要介绍pytorch
PyTorch由 Facebook 的人工智能研究小组开发和维护。PyTorch 以其动态计算图Dynamic Computational Graph和易用性著称非常适合研究人员和开发者进行实验和快速原型开发。TensorFlow由 Google 开发和维护。TensorFlow 是一个更加成熟和全面的框架支持大规模的生产环境部署特别是在云计算和分布式计算方面具有优势。
然后介绍两个小工具
dir()打开该包看看里面有什么东西如果IDE使用的是pycharm的话按住Ctrl直接跳转输入函数的参数的时候按住CtrlP可以看需要填哪些参数
help()官方解释文档教你如何使用该工具
神经网络搭建步骤 数据集介绍 数据集为CIFAR10
CIFAR-10 数据集由 10 个类的 60000 张 32x32 彩色图像组成每个类有 6000 张图像。有 50000 张训练图像和 10000 张测试图像。图像大小为3x32x32
数据集分为 5 个训练批次和 1 个测试批次每个批次有 10000 张图像。测试批次包含每个类中随机选择的 1000 张图像。训练批次包含按随机顺序排列的剩余图像但某些训练批次可能包含来自一个类的图像多于另一个类的图像。在它们之间训练批次正好包含来自每个类的 5000 张图像。
以下是数据集中的类以及每个类的 10 张随机图像 运行下列代码会导入数据集没有下载的会自动下载
datasets导入数据集
dataloader分发数据每批次送入64图片进入网络训练
transform更改图片数据的类型比如将PIL改成tensor类型
train_data torchvision.datasets.CIFAR10(./dataset,trainTrue,transformtorchvision.transforms.ToTensor(),downloadTrue)
test train_data.classes
print(test)
test_data torchvision.datasets.CIFAR10(./dataset,trainFalse,transformtorchvision.transforms.ToTensor(),downloadTrue)
train_dataloader DataLoader(train_data,batch_size64)
test_dataloader DataLoader(test_data,batch_size64)搭建网络
由官网可知官网链接PyTorch documentation — PyTorch 2.4 documentation使用pytorch搭建网络至少需要重写2个函数一个__init__() 初始化函数另一个forward()前向传播函数下图为官网截图 按照官网给的例子我们重写我们的网络结构如下图所示
网络结构如下图所示 代码思路输入3x32x32---最后输出10个参数具体过程如下图所示 二维卷积参数计算公式如下图根据输入输出计算padding和stride 代码实现
使用sequential()
class Wisdom(nn.Module):def __init__(self):super(Wisdom, self).__init__()self.model1 Sequential(nn.Conv2d(3, 32, 5, padding2),nn.MaxPool2d(2),nn.Conv2d(32, 32, 5, padding2),nn.MaxPool2d(2),nn.Conv2d(32, 64, 5, padding2),nn.MaxPool2d(2),nn.Flatten(),nn.Linear(1024, 64),nn.Linear(64, 10))def forward(self, x):x self.model1(x)return x 不使用sequential()
class Wisdom(nn.Module):def __init__(self):super(Wisdom, self).__init__()self.conv1Conv2d(3,32,5,padding2)self.maxpool1MaxPool2d(2)self.conv2Conv2d(32,32,5,padding2)self.maxpool2MaxPool2d(2)self.conv3Conv2d(32,64,5,padding2)self.maxpool3MaxPool2d(2)self.flattenFlatten()self.linear1Linear(1024,64)self.linear2 Linear(64, 10)def forward(self,x):xself.conv1(x)xself.maxpool1(x)xself.conv2(x)xself.maxpool2(x)xself.conv3(x)xself.maxpool3(x)xself.flatten(x)xself.linear1(x)xself.linear2(x)return x实例化神经网络对象损失函数优化器
#创建神经网络
wisdom Wisdom()
wisdomwisdom.cuda()
#损失函数
loss_fn nn.CrossEntropyLoss()
loss_fnloss_fn.cuda()
#优化器
learn_rate 0.01
optimizer torch.optim.SGD(wisdom.parameters(),lrlearn_rate)
损失函数Loss Function 常见的损失函数包括 选择哪种损失函数取决于具体的任务和模型类型。在训练过程中目标是最小化损失函数的值从而提高模型的预测准确性。
优化器
优化器Optimizer是机器学习中用于调整模型参数以最小化损失函数的算法。优化器通过迭代过程逐步更新模型的权重和偏置以找到损失函数的最小值。以下是一些常用的优化器 设置网络参数
使用writer SummaryWriter(logs_train)可以可视化整个训练过程
#设置网络的一些参数
#记录的训练次数
total_train_step 0
#记录测试次数
total_test_step 0
#训练的轮数
epoch10
#添加tensorboard
writer SummaryWriter(logs_train) 训练和验证网络并将重要信息可视化屏幕
重要代码解析
wisdom.train()标志网络进入训练状态
loss loss_fn(outputs,targets)计算损失函数
optimizer.zero_grad() 梯度置零防止上个梯度对本轮训练产生影响loss.backward()反向传播optimizer.step()梯度更新
wisdom.eval()模型进入测试状态
将损失值和精度闯入writer并绘制曲线图
writer.add_scalar(test_loss, total_test_loss, total_test_step) writer.add_scalar(test_accuracy, total_accuracy/test_data_size, total_test_step)
torch.save(wisdom,./model_train/wisdom_{}.pth.format(i))保存训练好模型
for i in range(epoch):print(----第{}轮开始----.format(i1))#开始训练#进入训练状态wisdom.train()for data in train_dataloader:imgs,targets dataimgsimgs.cuda()targetstargets.cuda()outputs wisdom(imgs)loss loss_fn(outputs,targets)#优化器调优optimizer.zero_grad()loss.backward()optimizer.step()total_train_step 1if total_train_step % 100 0:print(训练次数{},loss:{}:.format(total_train_step,loss))writer.add_scalar(train_loss,loss.item(),total_train_step)#模型测试#模型进入测试状态wisdom.eval()total_test_loss0total_accuracy 0with torch.no_grad():# 提高推理速度和节省内存for data in test_dataloader:imgs,targets dataimgs imgs.cuda()targets targets.cuda()outputs wisdom(imgs )loss loss_fn(outputs,targets)total_test_losstotal_test_lossloss.item()accuracy (outputs.argmax(1)targets).sum()total_accuracytotal_accuracyaccuracyprint(整体测试集合的loss:{}.format(total_test_loss))print(整体测试集合的准确率:{}.format(total_accuracy/test_data_size))writer.add_scalar(test_loss, total_test_loss, total_test_step)writer.add_scalar(test_accuracy, total_accuracy/test_data_size, total_test_step)total_test_step 1torch.save(wisdom,./model_train/wisdom_{}.pth.format(i))print(模型已经保存)#torch.save(wisdom.state_dict(),./model_train/wisdom_{}.pth.format(i))
writer.close()
使用GPU加速训练
确保电脑有显卡并正确安装驱动而且要正确下载对应cuda
下载教程
进入pytorch官网 根据自己的系统选择一般使用anaconda 在Windows下进行python环境管理复制红框部分在Anaconda Prompt 粘贴运行注意自己的cuda版本是否支持 查看cuda版本打开英伟达控制面板桌面右键或者系统右下角然后点击系统信息之后点击组件 GPU程序设置
在神经网络损失函数的实例对象后加.cuda()即可以及在图片数据后加.cuda()
wisdomwisdom.cuda()
loss_fnloss_fn.cuda()
imgsimgs.cuda()
targetstargets.cuda() 保存模型
torch.save(wisdom,./model_train/wisdom_{}.pth.format(i))
使用训练好的网络进行分类任务
加载网络模型
model torch.load(./model_train/wisdom_49.pth)
若出现runtime error 将模型加载方式换成下列语句将GPU训练的模型映射到CPU
出现runtimer error 将模型加载方式换成下列语句将GPU训练的模型映射到CPU
或者将分类的图片进行cuda加速
image image.cuda()#使用GPU训练的模型需要加CUDA 使用SummaryWriter使训练可视化
打开Anaconda Prompt再激活环境后运行下列命令
tensorboard --logdir D:\pyc_workspace\learn_pytorch\logs_train
上列的地址根据train.py代码中的这个语句确定
writer SummaryWriter(logs_train)
一定要改成自己的文件地址,具体操作见下图 可视化结果如下图所示 最后解释一个语句with torch.no_grad()提高推理速度和节省内存
with torch.no_grad():# 提高推理速度和节省内存for data in test_dataloader:imgs,targets dataimgs imgs.cuda()targets targets.cuda()outputs wisdom(imgs )loss loss_fn(outputs,targets)total_test_losstotal_test_lossloss.item()accuracy (outputs.argmax(1)targets).sum()total_accuracytotal_accuracyaccuracy
程序汇总
train.py
使用cpu训练网络
import torchvision
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterfrom model import *train_data torchvision.datasets.CIFAR10(./dataset,trainTrue,transformtorchvision.transforms.ToTensor(),downloadTrue)test_data torchvision.datasets.CIFAR10(./dataset,trainFalse,transformtorchvision.transforms.ToTensor(),downloadTrue)#length长度
train_data_size len(train_data)
test_data_size len(test_data)
print(训练集长度{}.format(train_data_size))
print(测试集长度{}.format(test_data_size))#使用dataloader加载数据集
train_dataloader DataLoader(train_data,batch_size64)
test_dataloader DataLoader(test_data,batch_size64)#创建神经网络
wisdom Wisdom()
#损失函数
loss_fn nn.CrossEntropyLoss()
#优化器
learn_rate 0.01
optimizer torch.optim.SGD(wisdom.parameters(),lrlearn_rate)#设置网络的一些参数
#记录的训练次数
total_train_step 0
#记录测试次数
total_test_step 0
#训练的轮数
epoch10
#添加tensorboard
writer SummaryWriter(logs_train)
#tensorboard --logdir D:\pyc_workspace\learn_pytorch\logs_trainfor i in range(epoch):print(----第{}轮开始----.format(i1))#开始训练#进入训练状态wisdom.train()for data in train_dataloader:imgs,targets dataoutputs wisdom(imgs)loss loss_fn(outputs,targets)#优化器调优optimizer.zero_grad()loss.backward()optimizer.step()total_train_step 1if total_train_step % 100 0:print(训练次数{},loss:{}:.format(total_train_step,loss))writer.add_scalar(train_loss,loss.item(),total_train_step)#模型测试#模型进入测试状态wisdom.eval()total_test_loss0total_accuracy 0with torch.no_grad():for data in test_dataloader:imgs,targets dataoutputs wisdom(imgs )loss loss_fn(outputs,targets)total_test_losstotal_test_lossloss.item()accuracy (outputs.argmax(1)targets).sum()total_accuracytotal_accuracyaccuracyprint(整体测试集合的loss:{}.format(total_test_loss))print(整体测试集合的准确率:{}.format(total_accuracy/test_data_size))writer.add_scalar(test_loss, total_test_loss, total_test_step)writer.add_scalar(test_accuracy, total_accuracy/test_data_size, total_test_step)total_test_step 1torch.save(wisdom,./model_train/wisdom_{}.pth.format(i))print(模型已经保存)#torch.save(wisdom.state_dict(),./model_train/wisdom_{}.pth.format(i))
writer.close()train_gpu.py
使用GPU训练网络
import torch
import torchvision
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWritertrain_data torchvision.datasets.CIFAR10(./dataset,trainTrue,transformtorchvision.transforms.ToTensor(),downloadTrue)
test train_data.classes
print(test)
test_data torchvision.datasets.CIFAR10(./dataset,trainFalse,transformtorchvision.transforms.ToTensor(),downloadTrue)class Wisdom(nn.Module):def __init__(self):super(Wisdom, self).__init__()self.model1 Sequential(nn.Conv2d(3, 32, 5, padding2),nn.MaxPool2d(2),nn.Conv2d(32, 32, 5, padding2),nn.MaxPool2d(2),nn.Conv2d(32, 64, 5, padding2),nn.MaxPool2d(2),nn.Flatten(),nn.Linear(1024, 64),nn.Linear(64, 10))def forward(self, x):x self.model1(x)return x#length长度
train_data_size len(train_data)
test_data_size len(test_data)
print(训练集长度{}.format(train_data_size))
print(测试集长度{}.format(test_data_size))#使用dataloader加载数据集
train_dataloader DataLoader(train_data,batch_size64)
test_dataloader DataLoader(test_data,batch_size64)#创建神经网络
wisdom Wisdom()
wisdomwisdom.cuda()
#损失函数
loss_fn nn.CrossEntropyLoss()
loss_fnloss_fn.cuda()
#优化器
learn_rate 0.01
optimizer torch.optim.SGD(wisdom.parameters(),lrlearn_rate)#设置网络的一些参数
#记录的训练次数
total_train_step 0
#记录测试次数
total_test_step 0
#训练的轮数
epoch10
#添加tensorboard
writer SummaryWriter(logs_train)
#tensorboard --logdir D:\pyc_workspace\learn_pytorch\logs_trainfor i in range(epoch):print(----第{}轮开始----.format(i1))#开始训练#进入训练状态wisdom.train()for data in train_dataloader:imgs,targets dataimgsimgs.cuda()targetstargets.cuda()outputs wisdom(imgs)loss loss_fn(outputs,targets)#优化器调优optimizer.zero_grad()loss.backward()optimizer.step()total_train_step 1if total_train_step % 100 0:print(训练次数{},loss:{}:.format(total_train_step,loss))writer.add_scalar(train_loss,loss.item(),total_train_step)#模型测试#模型进入测试状态wisdom.eval()total_test_loss0total_accuracy 0with torch.no_grad():# 提高推理速度和节省内存for data in test_dataloader:imgs,targets dataimgs imgs.cuda()targets targets.cuda()outputs wisdom(imgs )loss loss_fn(outputs,targets)total_test_losstotal_test_lossloss.item()accuracy (outputs.argmax(1)targets).sum()total_accuracytotal_accuracyaccuracyprint(整体测试集合的loss:{}.format(total_test_loss))print(整体测试集合的准确率:{}.format(total_accuracy/test_data_size))writer.add_scalar(test_loss, total_test_loss, total_test_step)writer.add_scalar(test_accuracy, total_accuracy/test_data_size, total_test_step)total_test_step 1torch.save(wisdom,./model_train/wisdom_{}.pth.format(i))print(模型已经保存)#torch.save(wisdom.state_dict(),./model_train/wisdom_{}.pth.format(i))
writer.close()test.py
利用神经网络模型进行分类记得把
img_path dog.jpg改成自己的路径
import torch
import torchvision
from PIL import Image
from torch import nn
from torch.nn import Sequentialtrain_data torchvision.datasets.CIFAR10(./dataset,trainTrue,transformtorchvision.transforms.ToTensor(),downloadTrue)
classes_list train_data.classes#分类物体列表img_path dog.jpg
# img_path airplane.jpg
image Image.open(img_path)
#image image.convert(RGB)#只保留为3通道transform torchvision.transforms.Compose([torchvision.transforms.Resize((32,32,)),torchvision.transforms.ToTensor()])
image transform(image)
print(image.shape)
class Wisdom(nn.Module):def __init__(self):super(Wisdom, self).__init__()self.model1 Sequential(nn.Conv2d(3, 32, 5, padding2),nn.MaxPool2d(2),nn.Conv2d(32, 32, 5, padding2),nn.MaxPool2d(2),nn.Conv2d(32, 64, 5, padding2),nn.MaxPool2d(2),nn.Flatten(),nn.Linear(1024, 64),nn.Linear(64, 10))def forward(self, x):x self.model1(x)return x#加载网络模型
model torch.load(./model_train/wisdom_49.pth)
#出现runtimer error 将模型加载方式换成下列语句将GPU训练的模型映射到CPU
#model torch.load(./model_train/wisdom_9.pth,map_locationtorch.device(cpu))
print(model)imagetorch.reshape(image,(1,3,32,32))#增加batch_size维度
model.eval()
with torch.no_grad():image image.cuda()#使用GPU训练的模型需要加CUDAoutput model(image)
print(output)
classes_indexoutput.argmax(1).item()
print(classes_list)print(测试图片为{}.format(classes_list[classes_index]))
总结------多看官网 ------