版权声明:本文为博主原创文章,如需转载请贴上原博文链接:https://blog.csdn.net/u011628215/article/details/108379046
前言:最近又把莫烦老师的PyTorch教学视频学习一遍,当使用PyTorch做回归练习的时候,想把整个神经网络训练做成模块(莫烦老师的教程中,只将建立神经网络定义了类——class Net(torch.nn.Module),我把训练过程、参数回传、优化器选择以及可视化分别做了函数),供以后直接调用,但是当做到可视化的时候,就遇到了问题,而问题就出在plt.ion()和plt.ioff()上。
注:from matplotlib import pyplot as plt
问题:莫烦老师的代码因为方便演示写成了一个整体(没有写成if __name__ == '__main__':的模块形式),所以运行没有问题;而当把代码做成单个的函数进行调用的时候,出现了可视化不连续的情况,即需要手动关闭figure窗口才能显示下一次训练的结果,如图1所示;
解决方法:直到写这个博客为止,我才发现是写函数的时候,plt.ioff()和plt.show()缩进错了,如图2所示。
拓展1:既然知道哪里出错了,就好解决了!关键是,对于plt.ion()和plt.ioff()的用法,依然有含糊,所以借此机会巩固一下。(见参考文献)
拓展2:在看过参考文献后,依然有些不太明白,希望能有些官方的案例以供参考,如图3所示,是从“Matplotlib Release 3.1.1.pdf”中截取的片段。
TIPS:
1.两种模式还是蛮有意思的,从最后一个例子来看,阻塞模式(ioff,这个是默认模式)下,plt.show()的作用就像是plt.pause(∞),延时了无穷时间,需要把窗口关闭才能显示下一张图。
# 最后的例子,将plt.ioff()去掉后,效果一样
import numpy as np
import matplotlib.pyplot as plt
for i in range(3):
plt.plot(np.random.rand(10))
plt.show()
# plt.show()感觉很有意思,试试看下面的代码,在console中一步一步的run
plt.ioff() # 此处的plt.ioff()可以省略,matplotlib中默认是阻塞式的
plt.figure() # 建立图像,但是并没有显示出来,控制台会出现“<Figure size 640x480 with 0 Axes>”
plt.show() # 显示图像,此时程序阻塞,即控制台不能再输入代码,除非将这个窗口关闭
# 再试试看下面的,在console单步运行
plt.ion() # 开启交互模式
plt.figure() # 此时会弹出窗口,就好像输入了plt.show()一样,但是此时程序不阻塞
plt.show() # 当在控制台输入这个代码的同时,刚才的窗口已经被console控制台遮挡住了,敲完回车键后,刚才的窗口又出现在桌面最顶层了,此时程序也不阻塞,是不是很神奇!
2.如果还是不能理解ion和ioff的作用的话,不妨试试看下面的代码:
from matplotlib import pyplot as plt
plt.ioff() # 开启阻塞模式
plt.figure() # 此时没有显示窗口
plt.ion() # 开启交互模式
plt.figure() # 此时显示窗口,并且弹出的窗口名称应该是“Figure2”,就好像plt.show()已经内置到plt.figure()中一样
plt.show() # 此时会将所有窗口全部显示,并且是按照刚才创建的顺序显示的Figure2在Figure1上层
# 如果觉得不明显的话,试试看这个
plt.ioff()
plt.figure()
plt.figure()
plt.figure()
plt.ion()
plt.figure() # 这行代码运行后,会出现“Figure4”
plt.show() # 显示四张图,Figure1在最底层,Figure4在最顶层
20201010更新:
当需要保存显示出来的图片,但是又不想要在显示器上出现该图片(是不是有点绕!),例如:需要用plt.subplot()分块显示多张图,但并不想在显示器上看到这张图而只想保存它,怎么做呢?
# 举个例子:all_txt_file是一个12*10000的二维列表(<class 'list'>),
# name是需要保存图片的名字(<class 'str'>)
def data_display(all_txt_file, name):
plt.ioff() # 注释这一行再试一次(如果不加这一行,窗口会被创建并显示在显示器上)
plt.figure()
plt.subplot(2, 6, 1)
plt.plot(all_txt_file[0])
plt.grid()
plt.subplot(2, 6, 2)
plt.plot(all_txt_file[4])
plt.grid()
plt.subplot(2, 6, 3)
plt.plot(all_txt_file[6])
plt.grid()
plt.subplot(2, 6, 4)
plt.plot(all_txt_file[7])
plt.grid()
plt.subplot(2, 6, 5)
plt.plot(all_txt_file[8])
plt.grid()
plt.subplot(2, 6, 6)
plt.plot(all_txt_file[5])
plt.grid()
plt.subplot(2, 6, 7)
plt.plot(all_txt_file[3])
plt.grid()
plt.subplot(2, 6, 8)
plt.plot(all_txt_file[2])
plt.grid()
plt.subplot(2, 6, 9)
plt.plot(all_txt_file[1])
plt.grid()
plt.subplot(2, 6, 10)
plt.plot(all_txt_file[10])
plt.grid()
plt.subplot(2, 6, 11)
plt.plot(all_txt_file[9])
plt.grid()
plt.subplot(2, 6, 12)
plt.plot(all_txt_file[11])
plt.grid()
plt.savefig('%s.jpg' % name)
plt.close()
if __name__ == '__main__':
# all_txt_file = [[]] # 2维列表
name = 'picture'
data_display(all_txt_file, name)
参考文献(感谢以下文献的贡献者们!):
1.matplotlib 画动态图以及plt.ion()和plt.ioff()的使用
2.matplotlib 学习笔记(4):ion 和 ioff
3.[matplotlib] plt.ion()的动态显示(附测试代码)
4.【matplotlib】 之 清理、清除 axes 和 figure (plt.cla、plt.clf、plt.close)
本文详细记录了在使用Python的Matplotlib库时,plt.ion()、plt.ioff()及plt.savefig()函数在神经网络训练可视化中的应用问题与解决方法。作者在尝试将PyTorch训练过程模块化时遇到可视化不连续的问题,发现是由于plt.ioff()和plt.show()的缩进错误。通过学习和实践,作者深入理解了这两种模式的区别,并给出了示例代码帮助读者理解。此外,还介绍了如何在不显示图像的情况下保存图片。

1万+

被折叠的 条评论
为什么被折叠?



