如何用pyplot优雅的绘制loss,acc,miou,psnr变化曲线

前言

TensorFlowBoard过于强大,导致我对它依赖性很强,今年转手使用pytorch进行开发,本以为没了TensorFlowBoard,后来发现人家Tensorflow封装了个TensorFlowBoardX,专门给其他深度学习框架使用,不得不说TensorFlow确实厉害。不过用的久了我就有点嫌麻烦了,因为每一次都要用命令去解析events文件,然后生成网址,复制到浏览器打开,有时候打不开或者打开的慢,出于我近期的研究工作只需要看一个图像的大概走向,不用多么好看、精美、功能强大,因此就使用matplotlib下的pyplot进行图像绘制。

参数保存 

众所周知,要画图得有参数才行,一开始我就直接写的把loss值啊,epoch啊,acc值什么的一股脑存在列表中,等训练结束了进行绘制保存,一开始还好,经历过两次服务器死机后我就傻眼了,一重启,训练的参数没保存,权重没保存(Pytorch如何临时保存训练参数文件用于再训练可以看这:Pytorch加载与保存模型(利用pth的参数更新h5预训练模型)_resumebb的博客-CSDN博客),更别谈要等到训练结束后才绘制的曲线图。吃一堑长一智,我决定将参数保存到文件中,每迭代一次保存一次,将来即使断电,死机也可以接着训练,然后从txt文件中读取数据进行绘制。

filename = 'result.txt'
with open(filename, 'w') as f:
    for epoch in range(args.num_epochs):
        XXXXXXXXXXXXXXXXXXXX(训练过程代码)
        f.write(str(epoch)+" ")
        f.write(str(loss)+" ")
        XXXXXXXXXXXXXXXXXXXX(要保存的变量)
        f.writelines(str(psnr)+"\n")
f.close()

大概流程如上,首先定义一个txt文件,给个路径,在训练前以可写方式创建文件对象f,在for循环中将epoch,loss,acc等需要保存的变量写入文件,它们之间用空格或者随便你想用什么隔开的符号进行分割,最后一个变量结束记得要加换行符,最后要记得关闭文件。

读取txt文件数据并绘制曲线图

举个例子我存了两种数据,一个是epoch,一个是psnr,它们之间用空格隔开,如下图:

首先要读取到txt文件中的数据:

f = open(r"psnr.txt")
line = f.readline()
a = []
b = []
while line:
    num1, num2 = list(map(float,line.split(" ")))
    a.append(num1)
    b.append(num2)
    line = f.readline()
f.close()
a = np.array(a)
b = np.array(b)

以图片的例子说明,两个变量通过split以空格来进行分割,然后将它们追加到a,b中,通过while循环读取所有行并追加,最后通过numpy的array方法进行转换,将list转为array,此时就拿到了txt中的数据。

接下来进行画图:

还是用这个例子,用pylot进行简单的绘制:

plt.plot(a, b, 'y-')
plt.tight_layout
plt.title('FSRCNN PSNR&LOSS')
plt.xlabel('Epochs')
plt.ylabel('PSNR')
plt.show()

出来的效果如下:

具体如何用matplotlib画图,里面的参数什么意思,加标题,画子图,线条颜色样式等参考:Matplotlib绘制各类图像(折线图,曲线图...)-画图的神_resumebb的博客-CSDN博客

还可以画统计图

import matplotlib.pyplot as plt

# 这两行代码解决 plt 中文显示的问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

keywords = ('model1', 'model2', 'model3', 'model4')
params = [12809, 11491, 11925, 13245]
flops = [415.06, 348.92, 353.84, 420.07]

plt.bar(keywords, params, width=0.35)
# plt.bar(keywords, params, width=0.2)
for i in range(4):
  plt.text(i,params[i],"%s"%params[i],va='center')
# plt.bar(keywords, params)
plt.title('参数对比')

plt.show()

 

  • 7
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值