tnblog
首页
视频
资源
登录

Pytorch TensorBoard运用(易化学习笔记六)

1529人阅读 2024/6/11 13:42 总访问:3475713 评论:0 收藏:0 手机
分类: python

Pytorch TensorBoard运用(易化学习笔记六)

TensorBoard简介


TensorBoard是TensorFlow的可视化工具包,旨在帮助研究人员和工程师理解、调试和优化他们的机器学习模型。
它提供了一系列强大的可视化功能,使用户能够追踪和展示训练过程中各种指标的变化,如损失函数和准确率。
此外,TensorBoard还允许用户查看模型的结构、权重和偏差的直方图,以及嵌入的投影。

TensorBoard简单实践


安装TensorBoard。

  1. %pip install tb-nightly


写一个简单的示范。

  1. from torch.utils.tensorboard import SummaryWriter
  2. # 创建日志的写入对象
  3. # 无参时,会自动在当前目录下创建日志的文件夹runs
  4. writer = SummaryWriter()
  5. x = range(100)
  6. for i in x:
  7. # 写入数据到日志的标量图'y=2x' 中
  8. writer.add_scalar('y=2x', i * 2, i)
  9. # 写入完成后,要关闭对象,避免资源占用
  10. writer.close()


接下来打开命令窗口,执行tensorboard --logdir=runs命令。


打开http://localhost:6006/#timeseries网页,查看我们的记录的标量图。
可以看到已经很好的记录了y=2x


我们再做一点小小的改动,并再次执行,然后在TensorBoard刷新并查看。

  1. writer.add_scalar('y=2x', i * 10, i)


我们发现它会保留历史的数据,tensorboard读取的runs目录下的日志文件。

TenanBoard 跟踪模型和LOSS曲线


创建-11的随机点,然后进行训练并通过TenanBoard进行记录损失。

  1. # 1.导入数据集
  2. import torch
  3. import matplotlib.pyplot as plt
  4. from torch import nn
  5. from torch.utils.tensorboard import SummaryWriter
  6. writer = SummaryWriter(comment='Linear')
  7. # 制造满足某规律(y=3*x+10)的样本点集,通过训练,找出权重w,使得该直线拟合样本点
  8. # 创建在-1 到1 间均分100个点的一维数组
  9. x = torch.linspace(-1, 1, 100)
  10. # 在1号位置,增加维数为1的维度,变成100行1列 的2维矩阵
  11. x = x.unsqueeze(1)
  12. #print(x.shape) #//torch.Size([100, 1]
  13. # 加上torch.rand()函数制造噪音
  14. y = 3 * x + 10 + torch.rand(x.size())
  15. # 2.构建模型
  16. # 设置内置的线性回归, 输入:1w维 输出:1维
  17. model = nn.Linear(1,1)
  18. # 使用均值损失函数
  19. criterion = nn.MSELoss()
  20. # 使用SGD优化器
  21. optimizer = torch.optim.SGD(model.parameters(), lr=1e-2)
  22. # 3.训练评估
  23. num_epochs = 1000
  24. for epoch in range(num_epochs):
  25. # 向前传播
  26. out = model(x)
  27. loss = criterion(out, y)
  28. # 向后传播
  29. # 注意每次迭代都需要清零
  30. optimizer.zero_grad()
  31. loss.backward()
  32. optimizer.step()
  33. # 保存loss与epoch 变化关系
  34. writer.add_scalar('Train', loss, epoch)
  35. # 每200个batch打印一次cost值,显示一下图像拟合效果
  36. if epoch % 100 == 0:
  37. print('Epoch[{}/{}], loss:{:.6f}'.format(epoch + 1, num_epochs, loss.item()))
  38. # 将model记录到graph中(graph是神经网络的数据流图)
  39. writer.add_graph(model, x)
  40. # 写入完成后,要关闭对象,避免资源占用
  41. writer.close()
  42. model.eval()
  43. predict = model(x)
  44. predict = predict.data.numpy()
  45. plt.plot(x.numpy(), y.numpy(), 'ro', label='样本点集')
  46. plt.plot(x.numpy(), predict, label='拟合后的直线')
  47. plt.show()

分析曲线图

  1. import torch
  2. import torchvision
  3. import torch.nn as nn
  4. import os
  5. ## 导入自定义的日志库
  6. from my_log import Outer,run_time
  7. # 指定日志的文件名(会自动加后缀为.log)
  8. out = Outer(os.path.basename("TensorBordeasy.ipynb"));
  9. ## 超参数设置
  10. MAX_EPOCH = 8 # 遍历数据集次数
  11. BATCH_SIZE = 64 # 批处理尺寸(每批用64个图片)
  12. LR = 0.001 # 学习率
  13. ## 数据载入
  14. trans = torchvision.transforms.ToTensor() # 定义数据预处理方式
  15. train_data = torchvision.datasets.MNIST( # 获取手写数字的训练集(其中都是28*28的图片)
  16. root="./data", # 设置数据集的根目录
  17. train=True, # 是训练集
  18. transform=trans, # 设置转换函数
  19. download=True # 下载数据集(只是第一次下载)
  20. )
  21. test_data = torchvision.datasets.MNIST( # 获取手写数字的测试集
  22. root="./data/",
  23. train=False, # 是测试集
  24. transform=trans,
  25. download=True # 下载数据集(只是第一次下载)
  26. )
  27. train_loader = torch.utils.data.DataLoader( # 载入训练集
  28. dataset=train_data, # 指定数据集载入
  29. batch_size=BATCH_SIZE, # 每批数目(每个包中的图片数)
  30. shuffle=True) # 乱序打包
  31. test_loader = torch.utils.data.DataLoader( # 载入测试集
  32. dataset=test_data,
  33. batch_size=BATCH_SIZE,
  34. shuffle=True)
  35. device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 没有gpu则使用cpu
  36. # 建立模型
  37. class LeNet(nn.Module): # 定义网络结构
  38. def __init__(self):
  39. super(LeNet, self).__init__()
  40. self.conv1 = nn.Sequential( # 卷积层: 由下面3层添加到顺序容器Sequential中而成
  41. nn.Conv2d(1, 6, 5, 1, 2), # /*2维卷积层: input_size=(1*28*28) -> 特征过滤(降维)
  42. # 当输入nn.Conv2d() 应该有对应参数提示信息或参考API函数, Ctrl+B 看声明 , Ctrl+Alt+B 查看实现代码
  43. # 参数未输入的将采用默认值
  44. # 如 class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
  45. # 输入通道: 1张灰度图 input_size=(1*28*28),图片需是28*28的(如是32*32 需公式来O=(I-F+2P)/S+1调整 变为Conv2d(1, 6, 5))
  46. # 输出通道: 6张特征图 (从不同角度看,得到不同特征图,如从轮廓,明暗效果,纹理等,可定义许多个)
  47. # 卷积核大小: 5x5 高宽相等可只写一个
  48. # 滑动步长: 1步
  49. # 填充: 2 -> 图边用2圈0填充(卷积后尺寸会变小,图边可用零填充,保证尺寸相同)
  50. # 注:为维持输出图片尺寸不变 由公式 O=(I-F+2P)/S+1=(28-5+2*2)/1+1 = 28
  51. # */
  52. nn.ReLU(), # 激活层: input_size=(6*28*28) -> 引入非线性(可挑选信息)
  53. nn.MaxPool2d(kernel_size=2, stride=2), # /*池化层(最值):output_size=(6*14*14) -> 舍去非显著特征,减少参数,缓解过拟合
  54. # O=(I-F+2P)/S+1 = (28-2+2*0)/2 + 1 = 14
  55. # */
  56. )
  57. self.conv2 = nn.Sequential(
  58. nn.Conv2d(6, 16, 5), # input_size=(6*14*14) O=(I-F+2P)/S+1=(14-5+2*0)/1+1 = 10
  59. nn.ReLU(), # input_size=(16*10*10)
  60. nn.MaxPool2d(2, 2) # output_size=(16*5*5) O=(I-F+2P)/S+1=(10-2+2*0)/2+1 = 5
  61. )
  62. self.fc1 = nn.Sequential( # 全连接层 (in:16*5*5 out:120)
  63. nn.Linear(16 * 5 * 5, 120),
  64. nn.ReLU()
  65. )
  66. self.fc2 = nn.Sequential(
  67. nn.Linear(120, 84),
  68. nn.ReLU()
  69. )
  70. self.fc3 = nn.Linear(84, 10)
  71. def forward(self, x): # 前向传播函数: 一旦构建前向传播网络成功,反向传播函数也会自动生成(autograd)
  72. x = self.conv1(x)
  73. x = self.conv2(x)
  74. # print(x.shape) torch.Size([64, 16, 5, 5]) 每批64张图片 输出16张 5*5的特征图
  75. x = x.view(x.shape[0], -1) # 扁平化:行64张 列-1自动推导,把16张 5*5的特征图压平为一维的点 -> 方便对接全连接层
  76. x = self.fc1(x)
  77. x = self.fc2(x)
  78. x = self.fc3(x)
  79. return x
  80. net = LeNet().to(device) # 新建模型
  81. criterion = nn.CrossEntropyLoss() # 使用交叉熵损失函数(通常用于多分类问题上)
  82. optimizer = torch.optim.SGD(net.parameters(), lr=LR, momentum=0.9) # 选择SGD的优化器
  83. out.info("model creat ok,start training")
  84. ## 训练模型
  85. from torch.utils.tensorboard import SummaryWriter
  86. writer = SummaryWriter(comment='Mnist')
  87. for epoch in range(MAX_EPOCH):
  88. sum_loss = 0.0 # 记录一个epoch的loss之和
  89. correct = 0.0
  90. total = 0.0
  91. # 数据读取
  92. for i, data in enumerate(train_loader): # enumerate 遍历列表对象,加上序号i
  93. inputs, labels = data # inputs:手写数字图片 labels:图片对应的数字标签
  94. inputs, labels = inputs.to(device), labels.to(device)
  95. optimizer.zero_grad() # 梯度清零: 每次迭代都需梯度清零,因pytorch默认会累积梯度
  96. # 向前传播
  97. preds = net(inputs) # 模型对输入进行预测
  98. loss = criterion(preds, labels) # 计算损失
  99. # 向后传播
  100. loss.backward() # 反向传播,计算梯度
  101. optimizer.step() # 按学习率减去少量梯度来调整权重
  102. # 统计预测信息
  103. _, predicted = torch.max(preds.data, 1)
  104. total += labels.size(0)
  105. correct += (predicted == labels).sum()
  106. sum_loss += loss.item()
  107. # 每训练100个batch打印一次平均loss
  108. if i % 100 == 99:
  109. loss_avg = sum_loss / 100
  110. sum_loss = 0.0
  111. # 输出: 训练的轮数, 迭代的样本数 平均损失值, 正确率
  112. out.info("Training: Epoch[{:0>3}/{:0>3}] Iteration[{:0>3}/{:0>3}] Loss: {:.4f} Acc:{:.2%} ".format(
  113. epoch + 1, MAX_EPOCH, i + 1, len(train_loader), loss_avg, correct / total))
  114. writer.add_scalars('Loss_group', {'train_loss': loss_avg}, epoch) # 记录训练loss到标量图scalar中
  115. writer.add_scalars('Accuracy_group', {'train_acc': correct / total}, epoch) # 记录Accuracy到标量图scalar中
  116. # 验证模型
  117. with torch.no_grad():# 每跑完一次epoch测试一下准确率
  118. correct = 0
  119. total = 0
  120. for data in test_loader:
  121. images, labels = data
  122. images, labels = images.to(device), labels.to(device)
  123. outputs = net(images)
  124. # 取得分最高的那个类
  125. _, predicted = torch.max(outputs.data, 1)
  126. total += labels.size(0)
  127. correct += (predicted == labels).sum()
  128. out.info('验证第%d个epoch的识别的准确率为:%d%%' % (epoch + 1, (100 * correct / total)))
  129. writer.add_scalars('Accuracy_group', {'test_acc': correct / total}, epoch) # 记录Accuracy到标量图scalar中
  130. out.info('Finished Training')
  131. writer.close()
  132. out.info(run_time())


损失下降的图如下


Accuracy_group记录了训练集和测试集的正确率。


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价
这一世以无限游戏为使命!
排名
2
文章
636
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术