前几日在利用Pytorch训练CIFAR-10数据集时,就在想这些训练过程中的loss怎么才能可视化出来,于是去找了一下,网上大部分的方法都是利用tensorboardX来实现的,后来发现其实新版本Pytorch里边自带的tensorboard就可以实现可视化。(应该是版本升级之后tensorboardX被torch.utils.tensorboard取代了)于是就尝试了一番:
安装tensorboard(感觉安装了torch之后其实这一步好像都不用安装,因为它是包含在torch里边的),但刚开始没试成功还是安装了:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorboard
试一下以下官方给的示例:
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter()
x = range(100)
for i in x:
writer.add_scalar('y=2x', i * 2, i)
writer.close()
这个示例是将训练的日志保存在了和你这个python文件同级的目录下,或者理解为 ‘./runs’ 。咱先不管啥意思,先试一下结果,运行之后,再去terminal 下调用一下命令:
tensorboard --logdir=E:\runs
后面这个E:\runs是我程序所在的目录,这一块支持中文路径,我试过了。然后就会报错
cudart64_101.dll not found
就找到这个解决方法:
cudart64_101.dll not found解决方法
其实说的就是把原安装目录下的cudart64_102.dll复制一份改名为cudart64_101.dll,方法的确有效。
再次在terminal 中执行上面的命令,可以看到已经tensorboard运行了:
2020-06-15 10:02:55.349105: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_101.dll
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.2.1 at http://localhost:6006/ (Press CTRL+C to quit)
复制http://localhost:6006/到浏览器即可看到结果:
左下角是我们文件的路径,如果这一块没有出现打勾的文件,一般就是路径填写的有问题,这种情况下右边的图像也不会出来的。
选取了一段代码(完整代码见另一篇博文):
利用Pytorch训练CIFAR-10数据集
#model.train()
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter('cifar-10')
for epoch in range(EPOCH):
for i,data in enumerate(train_loader):
inputs,labels = data
inputs,labels = inputs.to(device),labels.to(device)
#前向传播
outputs = model(inputs)
#计算损失函数
loss = criterion(outputs,labels)
#清空上一轮的梯度
optimizer.zero_grad()
#反向传播
loss.backward()
#参数更新
optimizer.step()
if i%50 == 0:
writer.add_scalar("Train/Loss", loss.item(), epoch*len(train_loader)+i)
#print('it’s training...{}'.format(i))
print('epoch{} loss:{:.4f}'.format(epoch+1,loss.item()))
#保存模型参数
torch.save(model,'cifar10_densenet161.pt')
print('cifar10_densenet161.pt saved')
#模型加载
#model = torch.load('cifar10_resnet.pt')#161.200epoch
model = torch.load('cifar10_densenet161.pt')
#测试
#model.eval()
model.train()
correct,total = 0,0
for j,data in enumerate(test_loader):
inputs,labels = data
inputs,labels = inputs.to(device),labels.to(device)
#前向传播
outputs = model(inputs)
_, predicted = torch.max(outputs.data,1)
total =total+labels.size(0)
correct = correct +(predicted == labels).sum().item()
if j%20 == 0:
writer.add_scalar("Train/Accuracy", 100.0*correct/total, j)
print('准确率:{:.4f}%'.format(100.0*correct/total))
可以看出核心语句:
writer.add_scalar(“Train/Accuracy”, 100.0*correct/total, j)
方法原型:
def add_scalar(self, tag, scalar_value, global_step=None, walltime=None):
tag:画图的标题
scalar_value:当前存入的数值,即y轴的值
global_step:在哪一步存入了一次数据,即x轴的值
由于只在本地笔记本上跑一下示意,选择了epoch=2跑了一下:
通过上面的图可以看出,tensorboard记录了每一步执行的loss和accuracy,而且还能看到执行到每一步时的耗时,这个对于认识模型、优化模型都是很有帮助的啦。
此外,tensorboard还可以可视化训练的图片和模型图,图片用 add_image,模型图用 add_graph。详见文末的官方文档。不再一一举例,按需自查。
更多可以参见官方文档:
VISUALIZING MODELS, DATA, AND TRAINING WITH TENSORBOARD
其他参考文章:
pytorch使用tensorboard实现可视化
用tensorboard实现可视化
PyTorch里如何利用TensorBoard–详解