环境:Anaconda3-2020.11-Windows-x86_64,conda虚拟环境:Python 3.6.8+torch 1.5.1
写入数据
写入标量
import torch
from torch.utils.tensorboard import SummaryWriter
import random
import os
# 这个函数在当前代码目录下创建一个runs文件夹,并在runs内部创建run1、run2...的文件夹,记录每次代码运行生成的数据
# 第一次运行创建runs,再创建run1
def get_next_run_folder():
runs_folder = 'runs'
if not os.path.exists(runs_folder):
os.makedirs(runs_folder)
return os.path.join(runs_folder, 'run1')
existing_runs = [d for d in os.listdir(runs_folder) if os.path.isdir(os.path.join(runs_folder, d)) and d.startswith('run')]
if not existing_runs:
return os.path.join(runs_folder, 'run1')
last_run_number = max(int(run.split('run')[1]) for run in existing_runs)
return os.path.join(runs_folder, f'run{last_run_number + 1}')
log_dir = get_next_run_folder()
writer = SummaryWriter(log_dir)
for i in range(100):
# 写入数据,data1表示数据标签,random.randint(0,20)表示纵坐标值, global_step=i表示横坐标值
writer.add_scalar('data', random.randint(0,20), global_step=i)
writer.close()
由于torch安装在conda 虚拟环境中,首先激活虚拟环境,然后运行以下代码
tensorboard --logdir=data_path
# 端口号默认为6006,如果要在其他端口查看数据,需要在后面指定端口号
# 理论上可以是从 1 到 65535 之间的任何未被占用的端口。但一些常见的端口(如 80 # 用于 HTTP、443 用于 HTTPS 等)可能已经被其他服务占用,
# 所以通常选择一个较大的、不太可能被占用的数字作为端口号。
tensorboard --logdir=data_path --port=6005
data_path是数据所在路径,这里是E:\ju\runs
网页打开结果如下,图中共三组数据:
如果要写入多组不同的数据,for循环添加代码即可,注意用不同的标签
for i in range(100):
# 写入数据,data1表示数据标签,random.randint(0,20)表示纵坐标值, global_step=i表示横坐标值
writer.add_scalar('data1', random.randint(0,20), global_step=i)
writer.add_scalar('data2', random.randint(0,20), global_step=i)
结果如下,图中共两组数据:
写入向量
修改for循环的代码
for i in range(100):
# 写入数据,data1表示数据标签,random.randint(0,20)表示纵坐标值, global_step=i表示横坐标值
writer.add_scalars('vector_data1', {'data1': random.randint(0,20),
'data2': random.randint(0,20),
'data3': random.randint(0,20)}, global_step=i)
writer.close()
写入多个标量只生成一个数据文件,但是写入向量则创建了三个文件夹存储数据,但都是在一个图中呈现数据。
写入多组向量的情况也是直接在for循环添加代码即可,但是要注意用不同的数据标签区分。
遇到的问题
当一个文件夹下生成两个或多个events
文件的情况时,画出来的曲线就会出现下图的连线,这是由于没有将每次生成的events
文件放进独立的文件夹导致的。
需要新建两个文件夹,分别存放一个events
文件。
但更好的办法是从代码入手,将每次运行生成的events
文件放到独立的文件夹中。
导出数据
先勾选左上角的Show data download links
右下角会出现数据导出的选项,选中需要的数据,点击CSV或JSON就能导出
可视化神经网络结构
运行以下代码,打印神经网络结构
import torch
import torch.nn as nn
from torch.utils.tensorboard import SummaryWriter
class MyNetwork(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(MyNetwork, self).__init__()
self.linear = nn.Linear(input_size, hidden_size)
self.lstm = nn.LSTM(hidden_size, hidden_size, batch_first=True)
self.output_layer = nn.Linear(hidden_size, output_size)
def forward(self, x):
out = self.linear(x)
out, _ = self.lstm(out.unsqueeze(0))
out = self.output_layer(out.squeeze(0))
return out
# 实例化
net = MyNetwork(input_size=10, hidden_size=20, output_size=5)
print(net)
但是只是文本的格式
tensorboard中能够可视化神经网络,在上面的代码中加上以下代码
writer = SummaryWriter()
writer.add_graph(net, torch.randn(32, 10).squeeze(dim=1))
writer.close()
同样地,用tensorboard --logdir=data_path
命令查看,这里不再赘述,打开如下
共三个模块,双击可以查看各个模块的内部结构,MyNetwork模块的结构如下