关于kaggle如何用tensorboard监视训练过程
前言
主要为了解决在kaggle上打开event文件,但是网页无法连接的问题。(当然只要是网站不给访问的这里都能解决,往下看吧):)
一.生成event
如果运行的时候程序提示no module xxx,直接!pip install xxx先装库
下面的代码通过jupyter直接运行,可以生成一个event文件,这个需要下载下来后续使用。
注:这段代码不记得是从哪找的了,有人找到了可以踹我
import torchvision
import torch.utils.data as Data
# 准备训练用的MNIST数据集
train_data = torchvision.datasets.MNIST(
root = "./data/MNIST", # 提取数据的路径
train=True, # 使用MNIST内的训练数据
transform=torchvision.transforms.ToTensor(), # 转换成torch.tensor
download=True # 如果是第一次运行的话,置为True,表示下载数据集到root目录
)
# 定义loader
train_loader = Data.DataLoader(
dataset=train_data,
batch_size=128,
shuffle=True,
num_workers=0
)
test_data = torchvision.datasets.MNIST(
root="./data/MNIST",
train=False, # 使用测试数据
download=False
)
# 将测试数据压缩到0-1
test_data_x = test_data.data.type(torch.FloatTensor) / 255.0
test_data_x = torch.unsqueeze(test_data_x, dim=1)
test_data_y = test_data.targets
# 打印一下测试数据和训练数据的shape
print("test_data_x.shape:", test_data_x.shape)
print("test_data_y.shape:", test_data_y.shape)
for x, y in train_loader:
print(x.shape)
print(y.shape)
break
import torch
import torch.nn as nn
class ConvNet(nn.Module):
def __init__(self):
super(ConvNet, self).__init__()
self.conv1 = nn.Sequential(
nn.Conv2d(1, 16, 3, 1, 1),
nn.ReLU(),
nn.AvgPool2d(2, 2)
)
self.conv2 = nn.Sequential(
nn.Conv2d(16, 32, 3, 1, 1),
nn.ReLU(),
nn.MaxPool2d(2, 2)
)
self.fc = nn.Sequential(
nn.Linear(32 * 7 * 7, 128),
nn.ReLU(),
nn.Linear(128, 64),
nn.ReLU()
)
self.out = nn.Linear(64, 10)
def forward(self, x):
x = self.conv1(x)
x = self.conv2(x)
x = x.view(x.size(0), -1)
x = self.fc(x)
output = self.out(x)
return output
from tensorboardX import SummaryWriter
from sklearn.metrics import accuracy_score
MyConvNet = ConvNet()
logger = SummaryWriter(log_dir="data/log")
# 获取优化器和损失函数
optimizer = torch.optim.Adam(MyConvNet.parameters(), lr=3e-4)
loss_func = nn.CrossEntropyLoss()
log_step_interval = 100 # 记录的步数间隔
for epoch in range(2):
print("epoch:", epoch)
# 每一轮都遍历一遍数据加载器
for step, (x, y) in enumerate(train_loader):
# 前向计算->计算损失函数->(从损失函数)反向传播->更新网络
predict = MyConvNet(x)
loss = loss_func(predict, y)
optimizer.zero_grad() # 清空梯度(可以不写)
loss.backward() # 反向传播计算梯度
optimizer.step() # 更新网络
global_iter_num = epoch * len(train_loader) + step + 1 # 计算当前是从训练开始时的第几步(全局迭代次数)
if global_iter_num % log_step_interval == 0:
# 控制台输出一下
print("global_step:{}, loss:{:.2}".format(global_iter_num, loss.item()))
# 添加的第一条日志:损失函数-全局迭代次数
logger.add_scalar("train loss", loss.item() ,global_step=global_iter_num)
# 在测试集上预测并计算正确率
test_predict = MyConvNet(test_data_x)
_, predict_idx = torch.max(test_predict, 1) # 计算softmax后的最大值的索引,即预测结果
acc = accuracy_score(test_data_y, predict_idx)
# 添加第二条日志:正确率-全局迭代次数
logger.add_scalar("test accuary", acc.item(), global_step=global_iter_num)
# 添加第三条日志:这个batch下的128张图像
img = torchvision.utils.make_grid(x, nrow=12)
logger.add_image("train image sample", img, global_step=global_iter_num)
# 添加第三条日志:网络中的参数分布直方图
for name, param in MyConvNet.named_parameters():
logger.add_histogram(name, param.data.numpy(), global_step=global_iter_num)
二.利用xshell查看
1.首先是下载xshell,百度即可(后续放链接)
2.下载好后双击打开,创建服务器以及配置端口,配置界面为:
会话管理器-新建会话(右键)-属性-隧道-添加
配置参数如下:
3. 找到装载了event文件的路径:
我的是:
4. 在xshell上的命令行利用cd进入到log文件的上一级:
5. 然后输入:tensorboard --logdir=log
6. 然后复制网址在浏览器粘贴就打开查看了
图中会出现一浅一深的线,其中浅的线代表真实数据,深线是代表smooth后的数据,在左侧把smoothing拖到0,就能消除深线。
注意:
① xshell需要保持运行状态,不然网页还是打不开
② 命令都是在xshell中输入,不要弄错了
③注意xshell中,是没有ctrl+c和v的快捷键的,不要手快用ctrl+c复制了,在xshell中这个是断开连接的意思,用鼠标右键复制粘贴即可
结语
本文仅关注如何得到打开的结果,中间出现的提示我也不太清楚(但是好用就完事),后续会继续更新打开的原理,大家感兴趣的可以点点关注插个眼。
2023/9/19进一步更新
补充
一. 如何利用SummaryWriter对训练过程进行监视
主要有四个步骤,为了突出主要的监视流程,所以用…省略了网络搭建以及部分输入参数(具体可配合上文的例子食用)
#步骤1:从pytorch中导入对应的包
from torch.utils.tensorboard import SummaryWriter
#步骤2:实例化SummaryWriter
writer = SummaryWriter("名字")
...
#步骤3:添加检测的scaler(标量)
def train(..., tf_writer):
...
tf_writer.add_scalar('名字', 纵坐标, 横坐标)
...
#步骤4:关闭writer
writer.close()