准备工作
- pytorch环境,按照网上教程自行配置,执行
import torch
print(torch.__version__)
torch.cuda.is_available()
得到对应的版本号和CUDA可用就没问题,如下:
- tensorboard安装
直接命令行pip install tensorboard
,完成安装后可以在命令行输入tensorboard
调用。
pytorch官方:一旦你安装了TensorBoard,这些实用程序就可以让你记录PyTorch模型。 并将指标放入一个目录中,以便在 TensorBoard UI 中进行可视化。 标量、图像、直方图、图形和嵌入可视化都是 支持 PyTorch 模型和张量以及 Caffe2 网络和 blobs。
官方例程
根据官方的例程熟悉下流程
import torch
import torchvision
from torch.utils.tensorboard import SummaryWriter
from torchvision import datasets, transforms
# Writer will output to ./runs/ directory by default
writer = SummaryWriter()
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
trainset = datasets.MNIST('mnist_train', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
model = torchvision.models.resnet50(False)
# Have ResNet model take in grayscale rather than RGB
model.conv1 = torch.nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3, bias=False)
images, labels = next(iter(trainloader))
grid = torchvision.utils.make_grid(images)
writer.add_image('images', grid, 0)
writer.add_graph(model, images)
writer.close()
其中writer = SummaryWriter()
创建了Writer对象,会默认将结果生成在./runs/目录下。
代码跑完之后就可以在对应的目录下找到生成的文件了。
打开命令行,进入生成文件的目录,执行tensorboard --logdir=runs
,我这里进了子目录了就把路径改成了./
打开浏览器,上图里面写了打开http://localhost:6006/,直接输入打开就可以看到tensorboard的界面了:
根据刚刚的例程:
writer.add_image('images', grid, 0)
writer.add_graph(model, images)
我们的文件里面应该有image和graph两部分,点击上方的IMAGES可以看到图像的信息和操作:
点开GRAPHS就可以看到网络结构图:
点击Download PNG就可以将当前的计算图下载,我下了个双击ResNet后展开的:
图表可视化部分官方给出的例程为:
train_loss = []
train_acc = []
test_loss = []
test_acc = []
writer = SummaryWriter()
for epoch in range(n_epochs):
print(‘epoch {}’.format(epoch + 1))
# 初始化 loss acc
running_loss = 0.0
running_acc = 0.0
for i, data in enumerate(train_loader, 1):
img, label = data
img = Variable(img.cuda())
label = Variable(label.cuda()) # Variable是torch.autograd中很重要的类。
# 它用来包装Tensor,将Tensor转换为Variable之后,可以装载梯度信息。
# pytorch的一个重要特点就是动态计算图,计算图中每一个节点代表一个变量,变量间建立运算关系并且可以修改,而不像Tensorflow中的计算图是固定不可变的。
out = model(img)
loss = criterion(out, label)
running_loss += loss.item() * label.size(0)
_, pred = torch.max(out, 1)
num_correct = (pred == label).sum()
accuracy = (pred == label).float().mean()
running_acc += num_correct.item()
optimizer.zero_grad()
loss.backward()
optimizer.step()
train_loss.append(running_loss / (len(train_dataset)))
train_acc.append(running_acc / (len(train_dataset)))
print('Finish {} epoch, Loss: {:.6f}, Acc: {:.6f}'.format(epoch + 1, running_loss / (len(train_dataset)), running_acc / (len(train_dataset))))
model.eval() # 模型评估
eval_loss = 0
eval_acc = 0
for data in test_loader: # 测试模型
img, label = data
img = Variable(img).cuda()
label = Variable(label).cuda()
out = model(img)
loss = criterion(out, label)
eval_loss += loss.item() * label.size(0)
_, pred = torch.max(out, 1)
num_correct = (pred == label).sum()
eval_acc += num_correct.item()
test_loss.append(eval_loss / (len(test_dataset)))
test_acc.append(eval_acc / (len(test_dataset)))
print('Test Loss: {:.6f}, Acc: {:.6f}'.format(eval_loss / (len(test_dataset)), eval_acc / (len(test_dataset))))
writer.add_scalar('loss/train_loss', np.array(train_loss[-1]), epoch)
writer.add_scalar('loss/test_loss', np.array(test_loss[-1]), epoch)
writer.add_scalar('acc/train_acc', np.array(train_acc[-1]), epoch)
writer.add_scalar('acc/test_acc', np.array(test_acc[-1]), epoch)
writer.add_images('1', img, global_step=None, walltime=None, dataformats='NCHW')