【python】matplotlib动态显示详解


Posted in Python onApril 11, 2019

1.matplotlib动态绘图

python在绘图的时候,需要开启 interactive mode。核心代码如下:

plt.ion(); #开启interactive mode 成功的关键函数
  fig = plt.figure(1);
  
  for i in range(100):
    filepath="E:/Model/weights-improvement-" + str(i + 1) + ".hdf5";
    model.load_weights(filepath);
    #测试数据
    x_new = np.linspace(low, up, 1000);
    y_new = getfit(model,x_new);
    # 显示数据
    plt.clf();
    plt.plot(x,y); 
    plt.scatter(x_sample, y_sample);
    plt.plot(x_new,y_new);
    
    ffpath = "E:/imgs/" + str(i) + ".jpg";
    plt.savefig(ffpath);
 
    plt.pause(0.01)       # 暂停0.01秒
    
  ani = animation.FuncAnimation(plt.figure(2), update,range(100),init_func=init, interval=500);
  ani.save("E:/test.gif",writer='pillow');
  
  plt.ioff()         # 关闭交互模式

2.实例

已知下面采样自Sin函数的数据:

  x y
1 0.093 -0.81
2 0.58 -0.45
3 1.04 -0.007
4 1.55 0.48
5 2.15 0.89
6 2.62 0.997
7 2.71 0.995
8 2.73 0.993
9 3.03 0.916
10 3.14 0.86
11 3.58 0.57
12 3.66 0.504
13 3.81 0.369
14 3.83 0.35
15 4.39 -0.199
16 4.44 -0.248
17 4.6 -0.399
18 5.39 -0.932
19 5.54 -0.975
20 5.76 -0.999

 通过一个简单的三层神经网络训练一个Sin函数的拟合器,并可视化模型训练过程的拟合曲线。

【python】matplotlib动态显示详解

2.1 网络训练实现

主要做的事情是定义一个三层的神经网络,输入层节点数为1,隐藏层节点数为10,输出层节点数为1。

import math;
import random;
from matplotlib import pyplot as plt
from keras.models import Sequential
from keras.layers.core import Dense
from keras.optimizers import Adam
import numpy as np
from keras.callbacks import ModelCheckpoint
import os
 
 
#采样函数
def sample(low, up, num):
  data = [];
  for i in range(num):
    #采样
    tmp = random.uniform(low, up);
    data.append(tmp);
  data.sort();
  return data;
 
#sin函数
def func(x):
  y = [];
  for i in range(len(x)):
    tmp = math.sin(x[i] - math.pi/3);
    y.append(tmp);
  return y;
 
#获取模型拟合结果
def getfit(model,x):  
  y = [];
  for i in range(len(x)):
    tmp = model.predict([x[i]], 10);
    y.append(tmp[0][0]);
  return y;
 
#删除同一目录下的所有文件
def del_file(path):
  ls = os.listdir(path)
  for i in ls:
    c_path = os.path.join(path, i)
    if os.path.isdir(c_path):
      del_file(c_path)
    else:
      os.remove(c_path)
 
if __name__ == '__main__':  
  path = "E:/Model/";
  del_file(path);
  
  low = 0;
  up = 2 * math.pi;
  x = np.linspace(low, up, 1000);
  y = func(x);
  
  # 数据采样
#   x_sample = sample(low,up,20);
  x_sample = [0.09326442022999694, 0.5812590520508311, 1.040490143783586, 1.5504427746047338, 2.1589557183817036, 2.6235357787018407, 2.712578091093361, 2.7379109336528167, 3.0339662651841186, 3.147676812083248, 3.58596337171837, 3.6621496731124314, 3.81130899864203, 3.833092859928872, 4.396611340802901, 4.4481080339256875, 4.609657879057151, 5.399731063412583, 5.54299720786794, 5.764084730699906];
  y_sample = func(x_sample);
  
  # callback
  filepath="E:/Model/weights-improvement-{epoch:00d}.hdf5";
  checkpoint= ModelCheckpoint(filepath, verbose=1, save_best_only=False, mode='max');
  callbacks_list= [checkpoint];
  
  # 建立顺序神经网络层次模型
  model = Sequential(); 
  model.add(Dense(10, input_dim=1, init='uniform', activation='relu'));
  model.add(Dense(1, init='uniform', activation='tanh'));
  adam = Adam(lr = 0.05);
  model.compile(loss='mean_squared_error', optimizer=adam, metrics=['accuracy']);
  model.fit(x_sample, y_sample, nb_epoch=1000, batch_size=20,callbacks=callbacks_list);
  
  #测试数据
  x_new = np.linspace(low, up, 1000);
  y_new = getfit(model,x_new);
  
  # 数据可视化
  plt.plot(x,y); 
  plt.scatter(x_sample, y_sample);
  plt.plot(x_new,y_new);
  
  plt.show();

2.2 模型保存

 在神经网络训练的过程中,有一个非常重要的操作,就是将训练过程中模型的参数保存到本地,这是后面拟合过程可视化的基础。训练过程中保存的模型文件,如下图所示。

【python】matplotlib动态显示详解

模型保存的关键在于fit函数中callback函数的设置,注意到,下面的代码,每次迭代,算法都会执行callbacks函数指定的函数列表中的方法。这里,我们的回调函数设置为ModelCheckpoint,其参数如下表所示:

参数 含义
filename 字符串,保存模型的路径
verbose 信息展示模式,0或1 (Epoch 00001: saving model to ...)
mode ‘auto',‘min',‘max'
monitor 需要监视的值
save_best_only 当设置为True时,监测值有改进时才会保存当前的模型。在save_best_only=True时决定性能最佳模型的评判准则,例如,当监测值为val_acc时,模式应为max,当监测值为val_loss时,模式应为min。在auto模式下,评价准则由被监测值的名字自动推断
save_weights_only 若设置为True,则只保存模型权重,否则将保存整个模型(包括模型结构,配置信息等)
period CheckPoint之间的间隔的epoch数
# callback
  filepath="E:/Model/weights-improvement-{epoch:00d}.hdf5";
  checkpoint= ModelCheckpoint(filepath, verbose=1, save_best_only=False, mode='max');
  callbacks_list= [checkpoint];
  
  # 建立顺序神经网络层次模型
  model = Sequential(); 
  model.add(Dense(10, input_dim=1, init='uniform', activation='relu'));
  model.add(Dense(1, init='uniform', activation='tanh'));
  adam = Adam(lr = 0.05);
  model.compile(loss='mean_squared_error', optimizer=adam, metrics=['accuracy']);
  model.fit(x_sample, y_sample, nb_epoch=1000, batch_size=20,callbacks=callbacks_list);

2.3 拟合过程可视化实现

利用上述保存的模型,我们就可以通过matplotlib实时地显示拟合过程。

import math;
import random;
from matplotlib import pyplot as plt
from keras.models import Sequential
from keras.layers.core import Dense
import numpy as np
import matplotlib.animation as animation
from PIL import Image
 
#定义kdd99数据预处理函数
def sample(low, up, num):
  data = [];
  for i in range(num):
    #采样
    tmp = random.uniform(low, up);
    data.append(tmp);
  data.sort();
  return data;
 
def func(x):
  y = [];
  for i in range(len(x)):
    tmp = math.sin(x[i] - math.pi/3);
    y.append(tmp);
  return y;
 
def getfit(model,x):  
  y = [];
  for i in range(len(x)):
    tmp = model.predict([x[i]], 10);
    y.append(tmp[0][0]);
  return y;
 
def init():
  fpath = "E:/imgs/0.jpg";
  img = Image.open(fpath);
  plt.axis('off') # 关掉坐标轴为 off
  return plt.imshow(img);
 
def update(i): 
  fpath = "E:/imgs/" + str(i) + ".jpg";
  img = Image.open(fpath);
  plt.axis('off') # 关掉坐标轴为 off
  return plt.imshow(img);
 
if __name__ == '__main__':  
  low = 0;
  up = 2 * math.pi;
  x = np.linspace(low, up, 1000);
  y = func(x);
  
  # 数据采样
#   x_sample = sample(low,up,20);
  x_sample = [0.09326442022999694, 0.5812590520508311, 1.040490143783586, 1.5504427746047338, 2.1589557183817036, 2.6235357787018407, 2.712578091093361, 2.7379109336528167, 3.0339662651841186, 3.147676812083248, 3.58596337171837, 3.6621496731124314, 3.81130899864203, 3.833092859928872, 4.396611340802901, 4.4481080339256875, 4.609657879057151, 5.399731063412583, 5.54299720786794, 5.764084730699906];
  y_sample = func(x_sample);
  
  # 建立顺序神经网络层次模型
  model = Sequential(); 
  model.add(Dense(10, input_dim=1, init='uniform', activation='relu'));
  model.add(Dense(1, init='uniform', activation='tanh'));
    
  plt.ion(); #开启interactive mode 成功的关键函数
  fig = plt.figure(1);
  
  for i in range(100):
    filepath="E:/Model/weights-improvement-" + str(i + 1) + ".hdf5";
    model.load_weights(filepath);
    #测试数据
    x_new = np.linspace(low, up, 1000);
    y_new = getfit(model,x_new);
    # 显示数据
    plt.clf();
    plt.plot(x,y); 
    plt.scatter(x_sample, y_sample);
    plt.plot(x_new,y_new);
    
    ffpath = "E:/imgs/" + str(i) + ".jpg";
    plt.savefig(ffpath);
 
    plt.pause(0.01)       # 暂停0.01秒
    
  ani = animation.FuncAnimation(plt.figure(2), update,range(100),init_func=init, interval=500);
  ani.save("E:/test.gif",writer='pillow');
  
  plt.ioff()

【python】matplotlib动态显示详解

以上所述是小编给大家介绍的matplotlib动态显示详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
用Python制作简单的朴素基数估计器的教程
Apr 01 Python
Django中URL视图函数的一些高级概念介绍
Jul 20 Python
sublime text 3配置使用python操作方法
Jun 11 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
Feb 21 Python
Python 使用matplotlib模块模拟掷骰子
Aug 08 Python
使用Rasterio读取栅格数据的实例讲解
Nov 26 Python
Python namedtuple命名元组实现过程解析
Jan 08 Python
python如何使用Redis构建分布式锁
Jan 16 Python
什么是python类属性
Jun 10 Python
Python爬虫之Selenium鼠标事件的实现
Dec 04 Python
Python超详细分步解析随机漫步
Mar 17 Python
Python采集壁纸并实现炫轮播
Apr 30 Python
python爬虫之验证码篇3-滑动验证码识别技术
Apr 11 #Python
Pyqt5如何让QMessageBox按钮显示中文示例代码
Apr 11 #Python
python面试题小结附答案实例代码
Apr 11 #Python
Python3使用Matplotlib 绘制精美的数学函数图形
Apr 11 #Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
Apr 11 #Python
Python单元和文档测试实例详解
Apr 11 #Python
Python的高阶函数用法实例分析
Apr 11 #Python
You might like
按上下级层次关系输出内容的PHP代码
2010/07/17 PHP
php数组(array)输出的三种形式详解
2013/06/05 PHP
php发送post请求函数分享
2014/03/06 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
2014/07/23 PHP
php类的自动加载操作实例详解
2016/09/28 PHP
php获取数据库中数据的实现方法
2017/06/01 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
2017/11/03 PHP
图片之间的切换
2006/06/26 Javascript
最佳的addEvent事件绑定是怎样诞生的
2011/10/24 Javascript
两种方法实现文本框输入内容提示消失
2013/03/17 Javascript
原生js实现跨浏览器获取鼠标按键的值
2013/04/08 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
2014/01/13 Javascript
控制文字内容的显示与隐藏示例
2014/06/11 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
2015/04/03 Javascript
js实现仿微博滚动显示信息的效果
2015/12/21 Javascript
JavaScript提升性能的常用技巧总结【经典】
2016/06/20 Javascript
浅谈Vue的基本应用
2016/12/27 Javascript
原生JS实现在线问卷调查投票特效
2017/01/03 Javascript
jquery将标签元素的高设为屏幕的百分比
2017/04/19 jQuery
angular directive的简单使用总结
2017/05/24 Javascript
mac中利用NVM管理不同node版本的方法详解
2017/11/08 Javascript
vue 界面刷新数据被清除 localStorage的使用详解
2018/09/16 Javascript
js中对象与对象创建方法的各种方法
2019/02/27 Javascript
Python使用文件锁实现进程间同步功能【基于fcntl模块】
2017/10/16 Python
浅谈python配置与使用OpenCV踩的一些坑
2018/04/02 Python
Python 实现「食行生鲜」签到领积分功能
2018/09/26 Python
python实现逐个读取txt字符并修改
2018/12/24 Python
Python 实现数据结构中的的栈队列
2019/05/16 Python
Python生成器传参数及返回值原理解析
2020/07/22 Python
python中numpy.empty()函数实例讲解
2021/02/05 Python
Puritan’s Pride(普丽普莱)官方网站:美国最大最全的保健品公司之一
2016/10/23 全球购物
保证金退回承诺函格式
2015/01/21 职场文书
优质服务标语口号
2015/12/26 职场文书
Python Pandas 删除列操作
2022/03/16 Python
Python字符串格式化方式
2022/04/07 Python