pytorch学习(五)tensorboard使用

1. 创建环境

首先创建一个环境:

conda create -n pytorch
conda activate pytorch

然后安装tensorboard

pip install tensorboard

安装opencv

pip install opencv-python

2. 简单的案例

标量和图像的显示:

2.1标量实现的方法是add_scalar,第一个参数是给显示框起个名称,第二个参数是一个标量(也就是一个数值),第三个参数是第几次。

2.2图像实现的方法是add_image,第一个仍然是给显示框起个名字,第二个是图像,可以按住ctrl, 把光标放在add_image上,可以看到显示类型,有HWC,CHW等,如果是HWC,则需要使用dataformats指明格式。0,1,2就表示的是第0,1,2次。意思就是第0次显示img1,第1次显示img,第二次显示img1。

新建test_tensorboard.py文件,文件内容写:

from torch.utils.tensorboard import SummaryWriter
import cv2writer = SummaryWriter("logs")
#writer = SummaryWriter() 默认可以不加参数
# writer = SummaryWriter(comment="lr_0.01_epoch_100")for i in range(10):writer.add_scalar("loss",2*i,i)img = cv2.imread("E:/TOOLE/slam_evo/pythonProject/2.jpg",-1)
img1 = cv2.imread("E:/TOOLE/slam_evo/pythonProject/1.jpg",-1)
print(type(img))
print(img.shape)
writer.add_image("image1",img1,0,dataformats='HWC')
writer.add_image("image1",img,1,dataformats='HWC')
writer.add_image("image1",img1,2,dataformats='HWC')
writer.close()

在终端运行就可以执行程序。

python test_tensorboard.py

然后在中断执行

(pytorch) E:\TOOLE\slam_evo\pythonProject>tensorboard --logdir=logs

如果想换个端口,则:

(pytorch) E:\TOOLE\slam_evo\pythonProject>tensorboard --logdir=logs --port=6067

得到一个网址:

点击该网址,显示结果如下:

2.3 图形重复的处理

我们看到图中有重复的,这是因为name,也就是add_image或者add_scalar在多次重复运行的时候,第一个参数name没有改变,图像显示的是多次叠加的图像,如果想要每次都不叠加显示,则可以这样处理:

1)删除event文件

       

2)改变add_image或者add_scalar的第一个参数的名子

writer.add_image("image1",img1,0,dataformats='HWC')

改成image2:

writer.add_image("image2",img1,0,dataformats='HWC')

3. 在程序中使用tensorboard,显示loss,训练图像等

import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets
from torchvision.transforms import ToTensor
import matplotlib.pyplot as plt
import numpy as np
import torchvision
from torch.utils.tensorboard import SummaryWriterwriter = SummaryWriter("logs")tensor = torch.randn(3,3)
bTensor = type(tensor) == torch.Tensor
print(bTensor)
print("tensor is on ", tensor.device)
#数据转到GPU
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
print(device)
if torch.cuda.is_available():tensor = tensor.to(device)print("tensor is on ",tensor.device)
#数据转到CPU
if tensor.device == 'cuda:0':tensor = tensor.to(torch.device("cpu"))print("tensor is on", tensor.device)
if tensor.device == "cpu":tensor = tensor.to(torch.device("cuda:0"))print("tensor is on", tensor.device)trainning_data = datasets.MNIST(root="data",train=True,transform=ToTensor(),download=True)
print(len(trainning_data))
test_data = datasets.MNIST(root="data",train=True,transform=ToTensor(),download=False)train_loader = DataLoader(trainning_data, batch_size=64,shuffle=True)
test_loader = DataLoader(test_data, batch_size=64,shuffle=True)print(len(train_loader)) #分成了多少个batch
print(len(trainning_data)) #总共多少个图像
# for x, y in train_loader:
#     print(x.shape)
#     print(y.shape)class MinistNet(nn.Module):def __init__(self):super().__init__()# self.flat = nn.Flatten()self.conv1 = nn.Conv2d(1,1,3,1,1)self.hideLayer1 = nn.Linear(28*28,256)self.hideLayer2 = nn.Linear(256,10)def forward(self,x):x= self.conv1(x)x = x.view(-1,28*28)x = self.hideLayer1(x)x = torch.sigmoid(x)x = self.hideLayer2(x)# x = nn.Sigmoid(x)return xmodel = MinistNet()
writer.add_graph(model, torch.rand([1,1,28,28]))
model = model.to(device)
cuda = next(model.parameters()).device
print(model)
criterion = nn.CrossEntropyLoss()
optimer = torch.optim.RMSprop(model.parameters(),lr= 0.001)def train():train_losses = []train_acces = []eval_losses = []eval_acces = []#训练model.train()tensorboard_ind =0;for epoch in range(10):batchsizeNum = 0train_loss = 0train_acc = 0train_correct = 0for x,y in train_loader:# print(epoch)# print(x.shape)# print(y.shape)writer.add_images("minist_img",x,tensorboard_ind)x = x.to('cuda')y = y.to('cuda')bte = type(x)==torch.Tensorbte1 = type(y)==torch.TensorA = x.deviceB = y.devicepred_y = model(x)loss = criterion(pred_y,y)optimer.zero_grad()loss.backward()optimer.step()loss_val = loss.item()batchsizeNum = batchsizeNum +1train_acc += (pred_y.argmax(1) == y).type(torch.float).sum().item()train_loss += loss.item()tensorboard_ind += 1writer.add_scalar("loss1",loss.item(),tensorboard_ind)# print("loss: ",loss_val,"  ",epoch, "  ", batchsizeNum)train_losses.append(train_loss / len(trainning_data))train_acces.append(train_acc / len(trainning_data))for i, (name, param) in enumerate(model.named_parameters()):if 'bn' not in name:writer.add_histogram(name, param, epoch)# if name == 'conv1':#     print(param.weight.shape)#     in_channels = param.weight.shape[1]#     out_channels = param.weight.shape[0]#     k_w, k_h = param.weight.shape[3], param.weight.shape[2]#     kernel_all = param.weight.view(-1, 1, k_w, k_h)  # 每个通道的卷积核#     kernel_grid = torchvision.utils.make_grid(kernel_all, nrow=in_channels)#     writer.add_image(f'{name}_kernel', kernel_grid, global_step=epoch)#测试model.eval()with torch.no_grad():num_batch = len(test_data)numSize = len(test_data)test_loss, test_correct = 0,0for x,y in test_loader:x = x.to(device)y = y.to(device)pred_y = model(x)test_loss += criterion(pred_y, y).item()test_correct += (pred_y.argmax(1) == y).type(torch.float).sum().item()test_loss /= num_batchtest_correct /= numSizeeval_losses.append(test_loss)eval_acces.append(test_correct)print("test result:",100 * test_correct,"%  avg loss:",test_loss)PATH = "dict_model_%d_dict.pth"%(epoch)torch.save({"epoch": epoch,"model_state_dict": model.state_dict(), }, PATH)writer.close()plt.plot(np.arange(len(train_losses)), train_losses, label="train loss")plt.plot(np.arange(len(train_acces)), train_acces, label="train acc")plt.plot(np.arange(len(eval_losses)), eval_losses, label="valid loss")plt.plot(np.arange(len(eval_acces)), eval_acces, label="valid acc")plt.legend()  # 显示图例plt.xlabel('epoches')# plt.ylabel("epoch")plt.title('Model accuracy&loss')plt.show()torch.save(model,"mode_con_line2.pth")#保存网络模型结构# torch.save(model,) #保存模型中的参数torch.save(model.state_dict(),"model_dict.pth")# Press the green button in the gutter to run the script.
if __name__ == '__main__':train()

python  xx.py执行该文件,然后使用tensorboard --logdir=logs 得到一个网址,点击该网址即可得到显示信息。

显示loss:

显示训练图像:

参数直方图显示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/46400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索Puppeteer的强大功能:抓取隐藏内容

背景/引言 在现代网页设计中,动态内容和隐藏元素的使用越来越普遍,这些内容往往只有在特定的用户交互或条件下才会显示出来。为了有效地获取这些隐藏内容,传统的静态爬虫技术往往力不从心。Puppeteer,作为一个强大的无头浏览器工…

印尼语翻译通:AI驱动的智能翻译与语言学习助手

在这个多元文化交织的世界中,语言是连接我们的桥梁。印尼语翻译通,一款专为打破语言障碍而生的智能翻译软件,让您与印尼语的世界轻松接轨。无论是商务出差、学术研究,还是探索印尼丰富的文化遗产,印尼语翻译通都是您的…

代码随想录算法训练营第三十六天|1049. 最后一块石头的重量 II 、 494. 目标和 、 474.一和零

1049. 最后一块石头的重量 II 分成两堆石头,一堆石头的总重量是dp[target],另一堆就是sum - dp[target]。 在计算target的时候,target sum / 2 因为是向下取整,所以sum - dp[target] 一定是大于等于dp[target]的。 那么相撞之…

.NET C# 使用 iText 生成PDF

.NET C# 使用 iText 生成PDF 文章目录 .NET C# 使用 iText 生成PDF1 安装 iText 7 库:2 变量定义3 创建一个PDF4 段落5 旋转文本6 代码块7 外部链接8 内部链接9 表格10 注释11 线条12 二维码13 嵌入图像14 列表15 设置背景16 页眉17 页脚18 事件19 水印20 分栏21 源…

老古董Lisp(1):粗鲁先生Lisp再出发

粗鲁先生Lisp再出发 开始的原因 目标和梦想是最近考虑的一个问题。什么是目标?什么是梦想?梦想可以激励改变,目标才能实现改变。 开始这个部分的时候,我的梦想是什么?我的目标是什么?我想要什么&#xf…

libwebrtc.a+exosip连接fS 环境部署tips

//运行FS服务器 sudo ./freeswitch -nc -nonat //公网sudo ./freeswitch //运行客户端 sudo ./fs_cli //加载模块 load mod_av load mod_verto0.Invite交互过程 1.fs码率设置 2.用户密码改动 3.数字签名的摘要 4.FS收不到ACK 5.公网部署 6.查看frewswitch都占用哪些端口 7.日志…

Java(二十一)---栈的使用和模拟实现

文章目录 前言1.什么是栈(Stack)?2. 栈的模拟实现3.stack的使用![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/80c82d22f3ee49cfaa2915d1c961573e.png)4.关于栈的oj题4.1.有效的括号4.2.逆波兰表达式4.3.栈的压入、弹出序列4.4.最小栈 前言 前面几篇我们学习了顺序…

Vue--Router(路由)

目录 一 Router(路由) 1.作用 2.实现步骤 3.注意 一 Router(路由) 1.作用 Router又叫做路由,简单来说,就是用来实现vue的页面之间跳转的。 我们都知道,使用vue必然会涉及到很多个组件,也就是页面,而页面之间肯定需…

RK3588读取不到显示器edid

问题描述 3588HDMIout接老的显示器或者HDMI转DVI接DVI显示器显示不了或者显示内容是彩色条纹,但是这种显示器测试过如果接笔记本或者主机是可以直接显示的。这一类问题是HDMI下的i2c与显示器通讯没成功,读取不到设备的edid。问题包括全志的H3 、AML的S905都有遇到 测试环境…

Qt-事件与信号

事件和信号的区别在于,事件通常是由窗口系统或应用程序产生的,信号则是Qt定义或用户自定义的。Qt为界面组件定义的信号往往通常是对事件的封装,如QPushButton的clicked()信号可以看做对QEvent::MouseButtonRelease类事件的封装。 在使用界面组…

【QGroundControl二次开发】二.使用QT编译QGC(Windows)

【QGroundControl二次开发】一.开发环境准备(Windows) 二. 使用QT编译QGC(Windows) 2.1 打开QT Creator,选择打开项目,打开之前下载的QGC项目源码。 编译器选择Desktop Qt 6.6.3 MSVC2019 64bit。 点击运…

vue3-tree-org实现带照片的组织架构图

官方文档&#xff1a;vue3-tree-org 显示照片需要注意的地方 使用步骤 下载 npm install vue3-tree-org --save 在main.js中引入 import "vue3-tree-org/lib/vue3-tree-org.css"; import vue3TreeOrg from vue3-tree-org;app.use(vue3TreeOrg) 实现代码 <tem…

level 6 day2 网络基础2

1.socket&#xff08;三种套接字&#xff1a;认真看&#xff09; 套接字就是在这个应用空间和内核空间的一个接口&#xff0c;如下图 原始套接字可以从应用层直接访问到网络层&#xff0c;跳过了传输层&#xff0c;比如在ubtan里面直接ping 一个ip地址,他没有经过TCP或者UDP的数…

解决TypeError: __init__() takes 1 positional argument but 2 were given

问题描述&#xff1a; 如下图&#xff0c;在使用torch.nn.Sigmoid非线性激活时报错 源代码&#xff1a; class testrelu(nn.Module):def __init__(self):super().__init__()self.sigmoid Sigmoid()def forward(self, input):output self.sigmoid(input)return outputwriter…

记录贴-芋道源码

环境搭建 文字讲解 链接: 芋道源码-环境搭建&#xff08;一&#xff09;后端 链接: 芋道源码-环境搭建&#xff08;二&#xff09;前端 链接: 基于FastGPT和芋道源码挑战一句话生成代码 视频讲解 链接: 芋道源码零基础启动教程&#xff08;上&#xff09; 链接: 芋道源码零基…

Blackbox AI:你的智能编程伙伴

目录 Blackbox AI 产品介绍 Blackbox AI 产品使用教程 Blackbox AI体验 AI问答 代码验证 实时搜索 探索&代理 拓展集成 总结 Blackbox AI 产品介绍 Blackbox是专门为程序员量身定制的语言大模型&#xff0c;它针对20多种编程语言进行了特别训练和深度优化&#xff0c;在AI代…

React 从入门到实战 一一开发环境基础搭建(小白篇)

React 从入门到实战一一开发环境基础搭建&#xff08;小白篇&#xff09; React 介绍什么是 react &#xff1f;react 主要功能react 框架特点 开发工具渲染测试 React 介绍 最近两年&#xff0c;react 也愈来愈火热&#xff0c;想要在里面分一杯羹&#xff0c;那肯定逃不过 r…

UFS协议

1. 名词解释 UFS: universal flash storage SCSI&#xff1a;小型计算机系统接口 SPC&#xff1a;SCSI Primary Commands SBC&#xff1a; SCSI Block Commands Application Client&#xff1a;作为主机中SCSI命令和任务管理功能请求源的实体。 Device Server&#xff1a;设备…

高级java每日一道面试题-2024年7月17日(java内存模型-后期完善)

面试官: 你对java内存模型了解多少? 我回答: Java内存模型&#xff08;JMM&#xff0c;Java Memory Model&#xff09;是Java虚拟机&#xff08;JVM&#xff09;规范的一部分&#xff0c;它定义了线程之间的内存可见性和并发执行时的原子性、有序性和可见性等特性。理解JMM对…

Windows下使用Cygwin创建rsync服务端

1 下载Cygwin 访问官网Cygwin&#xff0c;点击setup-X86_64.exe即可开始下载 2 安装 前面全部默认。路径可以自己选择&#xff0c;站点选阿里云的&#xff0c;等待安装即可 3 配置 使用打开Cygwin安装后创建的快捷方式窗口&#xff0c;输入下面的指令将windows用户导入到cyg…