Tensorboard是TensorFlow官方提供的一个可视化工具,用于帮助开发者更好地理解和调试自己的模型。以下是使用Tensorboard的一些基本步骤:
-
在代码中引入Tensorboard库:
from torch.utils.tensorboard import SummaryWriter
-
在代码中实例化SummaryWriter对象,并指定保存日志文件的目录:
writer = SummaryWriter('logs')
-
在模型训练的过程中,将相关的指标写入SummaryWriter对象,例如:
writer.add_scalar('Train/Loss', train_loss, global_step=epoch) writer.add_scalar('Train/Accuracy', train_acc, global_step=epoch) writer.add_scalar('Val/Loss', val_loss, global_step=epoch) writer.add_scalar('Val/Accuracy', val_acc, global_step=epoch)
这些指标可以分别表示模型在训练集和验证集上的损失和准确率,global_step参数用于表示当前的epoch数。
-
在模型训练完成后,使用命令行工具进入日志文件目录,并执行以下命令:
tensorboard --logdir=./
这个命令将会启动Tensorboard服务器,并将日志文件目录作为参数传入。
-
在浏览器中打开http://localhost:6006,就可以看到Tensorboard的界面了。在这里,你可以查看训练过程中指标的变化、模型的结构、模型权重的直方图等等信息。
以下是一个使用Tensorboard的完整示例代码,以MNIST数据集为例:
import torch
import torch.nn as nn
import torch.optim as optim
from torch.optim.lr_scheduler import ReduceLROnPlateau
from torch.utils.data import DataLoader
from torchvision.datasets import MNIST
from torchvision.transforms import ToTensor
from torch.utils.tensorboard import SummaryWriter
from tqdm import tqdm# 数据准备
train_dataset = MNIST(root='./data', train=True, transform=ToTensor())
val_dataset = MNIST(root='./data', train=False, transform=ToTensor())
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=4)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False, num_workers=4)# 定义模型
class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(1, 32, kernel_size=3)self.conv2 = nn.Conv2d(32, 64, kernel_size=3)self.fc1 = nn.Linear(64*5*5, 128)self.fc2 = nn.Linear(128, 10)def forward(self, x):x = nn.functional.relu(self.conv1(x))x = nn.functional.relu(self.conv2(x))x = x.view(-1, 64*5*5)x = nn.functional.relu(self.fc1(x))x = self.fc2(x)return xmodel = Net()# 定义优化器和调度器
optimizer = optim.SGD(model.parameters(), lr=0.1)
scheduler = ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10)# 定义日志记录器
writer = SummaryWriter('logs')# 训练模型
num_epochs = 20
for epoch in range(num_epochs):# 训练train_loss = 0.0train_correct = 0model.train()for images, labels in tqdm(train_loader, desc='Train'):optimizer.zero_grad()outputs = model(images)loss = nn.functional.cross_entropy(outputs, labels)loss.backward()optimizer.step()train_loss += loss.item() * images.size(0)_, preds = torch.max(outputs, 1)train_correct += torch.sum(preds == labels)train_loss /= len(train_loader.dataset)train_acc = train_correct.double() / len(train_loader.dataset)# 验证val_loss = 0.0val_correct = 0model.eval()with torch.no_grad():for images, labels in tqdm(val_loader, desc='Val'):outputs = model(images)loss = nn.functional.cross_entropy(outputs, labels)val_loss += loss.item() * images.size(0)_, preds = torch.max(outputs, 1)val_correct += torch.sum(preds == labels)val_loss /= len(val_loader.dataset)val_acc = val_correct.double() / len(val_loader.dataset)# 更新学习率scheduler.step(val_loss)# 输出结果并记录日志print('Epoch [{}/{}], Train Loss: {:.4f}, Train Acc: {:.4f}, Val Loss: {:.4f}, Val Acc: {:.4f}'.format(epoch+1, num_epochs, train_loss, train_acc, val_loss, val_acc))writer.add_scalar('Train/Loss', train_loss, global_step=epoch)writer.add_scalar('Train/Accuracy', train_acc, global_step=epoch)writer.add_scalar('Val/Loss', val_loss, global_step=epoch)writer.add_scalar('Val/Accuracy', val_acc, global_step=epoch)# 记录权重直方图for name, param in model.named_parameters():writer.add_histogram(name, param.clone().cpu().data.numpy(), global_step=epoch)# 关闭日志记录器
writer.close()
在这个示例代码中,我们首先引入了SummaryWriter类,并在代码中实例化了一个对象writer
,指定了日志文件保存的目录。在模型训练的过程中,我们将相关的指标和权重直方图写入writer
对象中,
train_loss, global_step=epoch)
writer.add_scalar('Train/Accuracy', train_acc, global_step=epoch)
writer.add_scalar('Val/Loss', val_loss, global_step=epoch)
writer.add_scalar('Val/Accuracy', val_acc, global_step=epoch)
这些指标将会被记录在日志文件中,供后续使用。另外,我们还使用了writer.add_histogram
方法记录了模型权重的直方图。
在代码最后,我们调用writer.close()
方法关闭日志记录器。
在模型训练完成后,我们可以使用命令行工具进入日志文件目录,并执行以下命令启动Tensorboard服务器.
在服务器训练时如何在本地电脑查看tensorboard
可以在本地电脑上通过远程连接服务器的方式查看Tensorboard。具体步骤如下:
- 在服务器上启动Tensorboard,可以使用以下命令:
tensorboard --logdir=/path/to/log/directory --port=6006
其中,/path/to/log/directory
是保存Tensorboard日志文件的目录,--port
是指定Tensorboard运行的端口号,默认为6006
。
- 在本地电脑上通过SSH连接服务器,命令如下:
ssh username@server_address
其中,username
是服务器的用户名,server_address
是服务器的IP地址或域名。
- 在SSH连接中启动端口转发,命令如下:
ssh -L 16006:127.0.0.1:6006 username@server_address
其中,-L
参数指定本地端口和远程服务器端口的映射关系,16006
是本地端口号,127.0.0.1:6006
是远程服务器的IP地址和端口号。
- 在本地电脑上打开浏览器,访问
http://localhost:16006
,即可查看Tensorboard。