在本系列的这一点上,我们刚刚完成了培训过程中的网络运行。 现在,我们希望获得有关此过程的更多指标,以更好地了解幕后情况。
鸟瞰我们在培训过程中所处的位置。
TensorBoard提供了机器学习实验所需的可视化和工具:
从PyTorch 1.1.0版开始,PyTorch添加了一个tensorboard实用程序包,使我们能够将TensorBoard与PyTorch一起使用。
print(torch.__version__)
1.1.0
from torch.utils.tensorboard import SummaryWriter
要为PyTorch安装TensorBoard,请执行以下步骤:
tensorboard --version
pip install tensorboard
安装TensorBoard 1.15或更高版本后,我们就可以开始了!
请注意,PyTorch文档说TensorBoard版本1.14是必需的。但是,我无法在1.14版本上使用全部功能。这就是为什么在视频中使用每晚构建的原因。
TensorBoard是一个前端Web界面,它实质上从文件中读取数据并显示它。要使用TensorBoard,我们的任务是将我们要显示的数据保存到TensorBoard可以读取的文件中。
为了使我们更轻松,PyTorch创建了一个名为SummaryWriter的实用程序类。要访问此类,我们使用以下导入:
from torch.utils.tensorboard import SummaryWriter
导入该类后,我们可以创建该类的实例,然后将其用于将数据从程序中取出并放到文件系统上,然后由TensorBoard进行使用。
SummaryWriter类带有许多方法,我们可以调用这些方法来有选择地选择和选择我们希望TensorBoard可以使用的数据。首先,我们将网络和一批图像传递给编写者。
tb = SummaryWriter()
network = Network()
images, labels = next(iter(train_loader))
grid = torchvision.utils.make_grid(images)
tb.add_image('images', grid)
tb.add_graph(network, images)
tb.close()
该代码为TensorBoard创建一个名为tb的SummaryWriter实例。然后,创建我们的PyTorch网络的实例,并从我们的PyTorch数据加载器对象中解压缩一批图像和标签。
然后,将图像和网络添加到TensorBoard将使用的文件中。实际上,可以说网络图和图像批次都已添加到TensorBoard中。
要启动TensorBoard,我们需要在终端上运行tensorboard命令。这将启动一个本地服务器,该服务器将为TensorBoard UI和我们的SummaryWriter写入磁盘的数据提供服务。
默认情况下,PyTorch SummaryWriter对象将数据写入在当前工作目录中创建的名为./runs的目录中的磁盘。
当运行tensorboard命令时,我们传递一个参数来告诉tensorboard数据在哪里。就像这样:
tensorboard --logdir=runs
TensorBoard服务器将启动并正在侦听端口6006上的http请求。这些详细信息将显示在控制台中。
通过浏览至以下位置访问TensorBoard UI:
http://localhost:6006
在这里,我们将能够看到我们的网络图和图像数据。目前,这确实为我们提供了视觉效果,但没有接下来的有用。
我们可以添加到TensorBoard的下一个数据导入类型是数字数据。我们可以添加将随时间或历元显示的标量值。我们还可以将值添加到直方图中以查看值的频率分布。
要添加标量和直方图,我们使用PyTorch SummaryWriter类提供的相应方法。
这是调用的示例:
tb.add_scalar('Loss', total_loss, epoch)
tb.add_scalar('Number Correct', total_correct, epoch)
tb.add_scalar('Accuracy', total_correct / len(train_set), epoch)
tb.add_histogram('conv1.bias', network.conv1.bias, epoch)
tb.add_histogram('conv1.weight', network.conv1.weight, epoch)
tb.add_histogram('conv1.weight.grad', network.conv1.weight.grad, epoch)
这是一个示例,说明将这些调用放置在训练循环中的位置:
network = Network()
train_loader = torch.utils.data.DataLoader(train_set, batch_size=100)
optimizer = optim.Adam(network.parameters(), lr=0.01)
images, labels = next(iter(train_loader))
grid = torchvision.utils.make_grid(images)
tb = SummaryWriter()
tb.add_image('images', grid)
tb.add_graph(network, images)
for epoch in range(1):
total_loss = 0
total_correct = 0
for batch in train_loader: # Get Batch
# Pass Batch
# Calculate Loss
# Calculate Gradient
# Update Weights
tb.add_scalar('Loss', total_loss, epoch)
tb.add_scalar('Number Correct', total_correct, epoch)
tb.add_scalar('Accuracy', total_correct / len(train_set), epoch)
tb.add_histogram('conv1.bias', network.conv1.bias, epoch)
tb.add_histogram('conv1.weight', network.conv1.weight, epoch)
tb.add_histogram(
'conv1.weight.grad'
,network.conv1.weight.grad
,epoch
)
print(
"epoch", epoch,
"total_correct:", total_correct,
"loss:", total_loss
)
tb.close()
这会将这些值添加到TensorBoard中。这些值甚至在网络训练时实时更新。
随时间推移查看损失和准确性值会很有帮助。但是,我们可能需要承认,实际上并不需要TensorBoard。
TensorBoard的真正功能是它具有开箱即用的比较多个运行的功能。这使我们能够通过更改超参数值并比较运行来快速进行实验,以查看哪些参数最有效。
现在,我们应该对TensorBoard是什么以及如何使用它有了一个很好的了解。在下一集中,我们将看到如何利用TensorBoard更好地评估不同的网络训练运行。下一个见!