【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 相关文章推荐
Windows下使Python2.x版本的解释器与3.x共存的方法
Oct 25 Python
python开发简易版在线音乐播放器
Mar 03 Python
windows下python 3.6.4安装配置图文教程
Aug 21 Python
pygame游戏之旅 python和pygame安装教程
Nov 20 Python
关于PyTorch 自动求导机制详解
Aug 18 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
Aug 27 Python
Python Django框架防御CSRF攻击的方法分析
Oct 18 Python
python基于三阶贝塞尔曲线的数据平滑算法
Dec 27 Python
Python求两个字符串最长公共子序列代码实例
Mar 05 Python
python 实现仿微信聊天时间格式化显示的代码
Apr 17 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
May 03 Python
Pycharm打开已有项目配置python环境的方法
Jul 03 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 Mysql日期和时间函数集合
2007/11/16 PHP
php使用session二维数组实例
2014/11/06 PHP
PHP中curl_setopt函数用法实例分析
2015/04/16 PHP
PHP基于递归算法解决兔子生兔子问题
2018/05/11 PHP
javascript call和apply方法
2008/11/24 Javascript
jquery struts 验证唯一标识(公用方法)
2013/03/27 Javascript
Jquery easyui 下loaing效果示例代码
2013/08/12 Javascript
比较新旧两个数组值得增加和删除的JS代码
2013/10/30 Javascript
JQuery复制DOM节点的方法
2015/06/11 Javascript
input点击后placeholder中的提示消息消失
2016/01/15 Javascript
解析Node.js基于模块和包的代码部署方式
2016/02/16 Javascript
JS弹出窗口的运用与技巧大全
2016/11/01 Javascript
AngularJS遍历获取数组元素的方法示例
2017/11/11 Javascript
微信小程序带动画弹窗组件使用方法详解
2018/11/27 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
2019/01/29 Javascript
微信小程序的线程架构【推荐】
2019/05/14 Javascript
layui table 获取分页 limit的方法
2019/09/20 Javascript
部署vue+Springboot前后端分离项目的步骤实现
2020/05/31 Javascript
javaScript代码飘红报错看不懂?读完这篇文章再试试
2020/08/19 Javascript
解决vue页面刷新,数据丢失的问题
2020/11/24 Vue.js
Python使用MYSQLDB实现从数据库中导出XML文件的方法
2015/05/11 Python
举例讲解Python编程中对线程锁的使用
2016/07/12 Python
Python Pandas找到缺失值的位置方法
2018/04/12 Python
完美解决安装完tensorflow后pip无法使用的问题
2018/06/11 Python
对Python通过pypyodbc访问Access数据库的方法详解
2018/10/27 Python
Python提取支付宝和微信支付二维码的示例代码
2019/02/15 Python
python实现祝福弹窗效果
2019/04/07 Python
为什么从Python 3.6开始字典有序并效率更高
2019/07/15 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
2019/08/30 Python
关于CSS Tooltips(鼠标经过时显示)的效果
2013/04/10 HTML / CSS
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
严选全球尖货,立足香港:Bonpont宝盆
2018/07/24 全球购物
美国在线纱线商店:Darn Good Yarn
2019/03/20 全球购物
英国排名第一的停车场运营商:NCP
2019/08/26 全球购物
收入证明范本
2015/06/12 职场文书
《失物招领》教学反思
2016/02/20 职场文书