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

pytorh学习笔记——cifar10(四)用VGG训练

1、新建train.py,执行脚本训练模型:

import os
import timeimport torch
import torch.nn as nn
import torchvisionfrom vggNet import VGGbase, VGGNet
from load_cifar import train_loader, test_loader
import warnings
import tensorboardX# 忽略警告
warnings.filterwarnings('ignore')def main():# 定义超参数device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')  # 使用GPU训练# device = 'cpu'  # 使用CPU训练print('device:', device)batch_size = 128learning_rate = 0.1num_epoches = 100  # 训练100个epoch# 定义模型net = VGGNet().to(device)  # 将模型放入GPU# 定义损失函数和优化器loss_func = nn.CrossEntropyLoss()  # 交叉熵损失函数optimizer = torch.optim.Adam(net.parameters(), lr=learning_rate)  # 优化器使用Adamscheduler = torch.optim.lr_scheduler.StepLR(optimizer,step_size=5,gamma=0.9)  # 学习率衰减, 每5个epoch,学习率乘以0.9# 可视化log_path = 'logs/vggNet_log'   # 保存日志的文件夹if not os.path.exists(log_path):  # 如果log文件不存在,则创建os.makedirs(log_path)writer = tensorboardX.SummaryWriter(log_path)  # 创建一个writer# 训练模型# step_n = 0  # 记录训练次数for epoch in range(num_epoches):  # 训练num_epoches个epochprint('Epoch {}/{}'.format(epoch, num_epoches))begin_time = time.time()   # 记录开始时间net.train()  # 设置为训练模式for idx, (images, labels) in enumerate(train_loader):  # 遍历训练集,共有391个batch,每个batch有128个样本images = images.to(device)  # 将图片数据放入GPUlabels = labels.to(device)  # 将图片标签放入GPUoutputs = net(images)  # 前向传播loss = loss_func(outputs, labels)  # 计算损失optimizer.zero_grad()  # 梯度清零loss.backward()  # 反向传播optimizer.step()  # 优化器更新参数# writer.add_scalar('train_loss', loss.item(), global_step=step_n)  # 将loss添加到writer中# writer.add_scalar('train correct', 100.0 * correct.item() / batch_size,#                   global_step=step_n)  # 将正确率添加到writer中# step_n += 1  # 记录训练次数if (idx + 1) % 100 == 0:  # 每100个batch打印一次训练信息,每个batch有128个样本,相当于12800个样本打印一次_, pred = torch.max(outputs, dim=1)  # 获取预测结果correct = pred.eq(labels).cpu().sum()  # 计算正确率# pred:神经网络的输出预测张量。# labels:通常表示真实的标签。这个张量与 pred 有相同的形状。# pred.eq(labels.data):这个调用会生成一个布尔张量,表示在 pred 中的每个元素是否等于 labels 中的相应元素。结果会是一个同形状的张量,其中的值为 True 或 False。# .cpu():方法用于将张量从 GPU 转移到 CPU。# .sum()方法对布尔张量(True 是 1,False 是 0)进行求和,返回 True 值的数量。也就是说,它返回 pred 中与 labels 相等元素的个数。这通常用于计算模型的正确预测数量。# 请注意这里的eq()和sum()是torch中的方法,与python自带的eq()、sum()方法略有不同。# 详见https://blog.csdn.net/xulibo5828/article/details/143115452print('Train Accuracy: {} %'.format(100 * correct / batch_size))scheduler.step()  # 更新学习率end_time = time.time()  # 记录结束时间print('Each train_epoch take time: {} s'.format(end_time - begin_time))  # 打印每个epoch的耗时# 测试模型sum_loss = 0  # 记录测试损失sum_correct = 0  # 记录测试正确率net.eval()  # 设置为测试模式begin_time = time.time()   # 记录开始时间for idx, (images, labels) in enumerate(test_loader):  # 遍历训练集images = images.to(device)  # 将图片数据放入GPUlabels = labels.to(device)  # 将图片标签放入GPUoutputs = net(images)  # 前向传播# loss = loss_func(outputs, labels)  # 计算损失_, pred = torch.max(outputs, dim=1)  # 获取预测结果if (idx + 1) % 30 == 0:  # 每30个batch打印一次训练信息correct = pred.eq(labels).cpu().sum()  # 计算正确率# sum_loss += loss.item()  # 测试损失sum_correct += correct.item()  # 测试正确率print('Test Accuracy: {} %'.format(100 * correct / batch_size))# test_loss = sum_loss * 1.0 / len(test_loader)  # 计算测试损失# test_correct = sum_correct * 100.0 / len(test_loader.dataset) / batch_size  # 计算测试正确率# writer.add_scalar('test_loss', test_loss, global_step=epoch + 1)  # 将loss添加到writer中# writer.add_scalar('test correct', test_correct, global_step=epoch + 1)  # 将正确率添加到writer中end_time = time.time()  # 记录结束时间print('Each test_epoch take time: {} s'.format(end_time - begin_time))   # 打印每个epoch的耗时# 保存模型torch.save(net.state_dict(), 'vggNet.pkl')  # 保存模型print('Finished Training')writer.close()   # 关闭writerif __name__ == '__main__':main()

 第1个epoch的准确率:

Train Accuracy: 17.96875 %

第20个epoch的准确率:

Train Accuracy: 82.03125 %

 第50个epoch的准确率: 

Train Accuracy: 87.5 %

 没有继续训练。

2、加入可视化的代码:

import os
import timeimport torch
import torch.nn as nn
import torchvisionfrom vggNet import VGGbase, VGGNet
from load_cifar import train_loader, test_loader
import warnings
import tensorboardX# 忽略警告
warnings.filterwarnings('ignore')def main():# 定义超参数device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')  # 使用GPU训练# device = 'cpu'  # 使用CPU训练print('device:', device)batch_size = 128learning_rate = 0.1num_epoches = 100  # 训练100个epoch# 定义模型net = VGGNet().to(device)  # 将模型放入GPU# 定义损失函数和优化器loss_func = nn.CrossEntropyLoss()  # 交叉熵损失函数optimizer = torch.optim.Adam(net.parameters(), lr=learning_rate)  # 优化器使用Adamscheduler = torch.optim.lr_scheduler.StepLR(optimizer,step_size=5,gamma=0.9)  # 学习率衰减, 每5个epoch,学习率乘以0.9# 可视化log_path = 'logs/vggNet_log'   # 保存日志的文件夹if not os.path.exists(log_path):  # 如果log文件不存在,则创建os.makedirs(log_path)writer = tensorboardX.SummaryWriter(log_path)  # 创建一个writer# 训练模型step_n = 0  # 记录训练次数for epoch in range(num_epoches):  # 训练num_epoches个epochprint('Epoch {}/{}'.format(epoch, num_epoches))begin_time = time.time()   # 记录开始时间net.train()  # 设置为训练模式for idx, (images, labels) in enumerate(train_loader):  # 遍历训练集,共有391个batch,每个batch有128个样本images = images.to(device)  # 将图片数据放入GPUlabels = labels.to(device)  # 将图片标签放入GPUoutputs = net(images)  # 前向传播loss = loss_func(outputs, labels)  # 计算损失optimizer.zero_grad()  # 梯度清零loss.backward()  # 反向传播optimizer.step()  # 优化器更新参数_, pred = torch.max(outputs, dim=1)  # 获取预测结果correct = pred.eq(labels).cpu().sum()  # 计算正确率# pred:神经网络的输出预测张量。# labels:通常表示真实的标签。这个张量与 pred 有相同的形状。# pred.eq(labels.data):这个调用会生成一个布尔张量,表示在 pred 中的每个元素是否等于 labels 中的相应元素。结果会是一个同形状的张量,其中的值为 True 或 False。# .cpu():方法用于将张量从 GPU 转移到 CPU。# .sum()方法对布尔张量(True 是 1,False 是 0)进行求和,返回 True 值的数量。也就是说,它返回 pred 中与 labels 相等元素的个数。这通常用于计算模型的正确预测数量。# 请注意这里的eq()和sum()是torch中的方法,与python自带的eq()、sum()方法略有不同。# 详见https://blog.csdn.net/xulibo5828/article/details/143115452writer.add_scalar('train_loss', loss.item(), global_step=step_n)  # 将loss添加到writer中writer.add_scalar('train correct', 100.0 * correct.item() / batch_size,global_step=step_n)  # 将正确率添加到writer中step_n += 1  # 记录训练次数if (idx + 1) % 100 == 0:  # 每100个batch打印一次训练信息,每个batch有128个样本,相当于12800个样本打印一次print('Train Accuracy: {} %'.format(100 * correct / batch_size))scheduler.step()  # 更新学习率end_time = time.time()  # 记录结束时间print('Each train_epoch take time: {} s'.format(end_time - begin_time))  # 打印每个epoch的耗时# 测试模型sum_loss = 0  # 记录测试损失sum_correct = 0  # 记录测试正确率net.eval()  # 设置为测试模式begin_time = time.time()   # 记录开始时间for idx, (images, labels) in enumerate(test_loader):  # 遍历训练集images = images.to(device)  # 将图片数据放入GPUlabels = labels.to(device)  # 将图片标签放入GPUoutputs = net(images)  # 前向传播# loss = loss_func(outputs, labels)  # 计算损失_, pred = torch.max(outputs, dim=1)  # 获取预测结果if (idx + 1) % 30 == 0:  # 每30个batch打印一次训练信息correct = pred.eq(labels).cpu().sum()  # 计算正确率# sum_loss += loss.item()  # 测试损失sum_correct += correct.item()  # 测试正确率print('Test Accuracy: {} %'.format(100 * correct / batch_size))test_loss = sum_loss * 1.0 / len(test_loader)  # 计算测试损失test_correct = sum_correct * 100.0 / len(test_loader.dataset) / batch_size  # 计算测试正确率writer.add_scalar('test_loss', test_loss, global_step=epoch + 1)  # 将loss添加到writer中writer.add_scalar('test correct', test_correct, global_step=epoch + 1)  # 将正确率添加到writer中end_time = time.time()  # 记录结束时间print('Each test_epoch take time: {} s'.format(end_time - begin_time))   # 打印每个epoch的耗时# 保存模型torch.save(net.state_dict(), 'vggNet.pkl')  # 保存模型print('Finished Training')writer.close()   # 关闭writerif __name__ == '__main__':main()

3、调用查看数据曲线:

        --打开anaconda的命令行窗口,输入:conda activate torch(这里的torch是自定义的环境名称),进入pytorch所在的环境

        --输入:tensorboard --logdir=E:\AI_tset\cifar10_demo\logs\vggNet_log,“E:\AI_tset\cifar10_demo\logs\vggNet_log”是训练脚本中定义的日志文件所在的目录。

 出现了:TensorBoard 2.18.0 at http://localhost:6006/,打开浏览器,输入http://localhost:6006/或者127.0.0.1:6006/,就会显示出数据曲线:

http://www.lryc.cn/news/469196.html

相关文章:

  • CRLF、UTF-8这些编辑器右下角的选项的意思
  • 【C++干货篇】——类和对象的魅力(四)
  • 基于java的诊所管理系统源码,SaaS门诊信息系统,二次开发的不二选择
  • O2OA如何实现文件跨服务器的备份
  • 语音提示器-WT3000A离在线TTS方案-打破语种限制/AI对话多功能支持
  • 使用HAL库的STM32工程,实现DMA传输USART发送接收数据
  • 常用排序算法总结
  • [项目详解][boost搜索引擎#2] 建立index | 安装分词工具cppjieba | 实现倒排索引
  • R语言编程
  • Mysql主主互备配置
  • 如何预防数据打架?数据仓库如何保持指标数据一致性开发指南(持续更新)
  • 我谈Canny算子
  • 算法的学习笔记—平衡二叉树(牛客JZ79)
  • SSM学习day01 JS基础语法
  • kubeadm快速自动化部署k8s集群
  • 解决JAVA使用@JsonProperty序列化出现字段重复问题(大写开头的字段重复序列化)
  • 分布式理论基础
  • Java应用程序的测试覆盖率之设计与实现(二)-- jacoco agent
  • 【机器学习】13. 决策树
  • 《a16z : 2024 年加密货币现状报告》解析
  • Laravel 使用Simple QrCode 生成PNG遇到问题
  • 一站式学习 Shell 脚本语法与编程技巧,踏出自动化的第一步
  • 批处理操作的优化
  • 机器视觉运动控制一体机在DELTA并联机械手视觉上下料应用
  • RHCE-web篇
  • Java - 人工智能;SpringAI
  • MFC开发,给对话框添加定时器
  • LED灯珠:技术、类型与选择指南
  • C语言二刷
  • C++模块化程序设计举例