在训练神经网络的过程中需要用到很多的工具,最重要的是数据处理、可视化和GPU加速。本章主要介绍PyTorch在这些方面常用的工具模块,合理使用这些工具可以极大地提高编程效率。
由于内容较多,本文分成了五篇文章(1)数据处理(2)预训练模型(3)TensorBoard(4)Visdom(5)CUDA与小结。
整体结构如下:
全文链接:
在训练神经网络时,通常希望能够更加直观地了解训练情况,例如损失函数曲线、输入图片、输出图片等信息。这些信息可以帮助读者更好地监督网络的训练过程,并为参数优化提供方向和依据。最简单的办法就是打印输出,这种方式只能打印数值信息,不够直观,同时无法查看分布、图片、声音等。本节介绍两个深度学习中常用的可视化工具:TensorBoard和Visdom。
最初,TensorBoard是作为TensorFlow的可视化工具迅速流行开来的。作为和TensorFlow深度集成的工具,TensorBoard能够展示TensorFlow的网络计算图,绘制图像生成的定量指标图以及附加数据。同时,TensorBoard是一个相对独立的工具,只要用户保存的数据遵循相应的格式,TensorBoard就能读取这些数据,进行可视化。
在PyTorch 1.1.0版本之后,PyTorch已经内置了TensorBoard的相关接口,用户在手动安装TensorBoard后便可调用相关接口进行数据的可视化,TensorBoard的主界面如下图所示。
![使用add_scalar记录标量]](https://img-blog.csdnimg.cn/direct/864745746f6244e080a0793ae578e5a1.png#pic_center)
TensorBoard的使用非常简单,首先使用以下命令安装TensorBoard:
pip install tensorboard
待安装完成后,通过以下命令启动TensorBoard,其中path为log文件的保存路径:
tensorboard --logdir=path
TensorBoard的常见操作包括记录标量、显示图像、显示直方图、显示网络结构、可视化embedding等,下面逐一举例说明:
In: import torch
import torch.nn as nn
import numpy as np
from torchvision import models
from torch.utils.tensorboard import SummaryWriter
from torchvision import datasets,transforms
from torch.utils.data import DataLoader
# 构建logger对象,log_dir用来指定log文件的保存路径
logger = SummaryWriter(log_dir='runs')
In: # 使用add_scalar记录标量
for n_iter in range(100):
logger.add_scalar('Loss/train', np.random.random(), n_iter)
logger.add_scalar('Loss/test', np.random.random(), n_iter)
logger.add_scalar('Acc/train', np.random.random(), n_iter)
logger.add_scalar('Acc/test', np.random.random(), n_iter)
In: transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,),(0.5,))
])
dataset = datasets.MNIST('data/', download=True, train=False, transform=transform)
dataloader = DataLoader(dataset, shuffle=True, batch_size=16)
images, labels = next(iter(dataloader))
grid = torchvision.utils.make_grid(images)
In: # 使用add_image显示图像
logger.add_image('images', grid, 0)
In: # 使用add_graph可视化网络
class ToyModel(nn.Module):
def __init__(self, input_size=28, hidden_size=500, num_classes=10):
super().__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(hidden_size, num_classes)
def forward(self, x):
out = self.fc1(x)
out = self.relu(out)
out = self.fc2(out)
return out
model = ToyModel()
logger.add_graph(model, images)
In: # 使用add_histogram显示直方图
logger.add_histogram('normal', np.random.normal(0,5,1000), global_step=1)
logger.add_histogram('normal', np.random.normal(1,2,1000), global_step=10)
In: # 使用add_embedding进行embedding可视化
dataset = datasets.MNIST('data/', download=True, train=False)
images = dataset.data[:100].float()
label = dataset.targets[:100]
features = images.view(100, 784)
logger.add_embedding(features, metadata=label, label_img=images.unsqueeze(1))
打开浏览器输入http://localhost:6006
(其中,6006应改成读者TensorBoard所绑定的端口),就可以看到本文之前的可视化结果。
TensorBoard十分容易上手,读者可以根据个人需求灵活地使用上述函数进行可视化。本节介绍了TensorBoard的常见操作,更多详细内容读者可参考官方相关源码。