关于matplotlib的后端(Backend)

主要是在看《深入理解TensorFlow 架构设计与实现原理》遇到的问题,其中第3章有一段源码。

# -*- coding=utf-8 -*-
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np

# 打印日志的步长
log_step = 50
# ================ 1.定义超参数 ================
# 学习率
learning_rate = 0.01
# 最大训练步数
max_train_steps = 1000
# ================ 2.输入数据 ================
# 构造训练数据
train_X = np.array([[3.3],[4.4],[5.5],[6.71],[6.93],[4.168],[9.779],[6.182],[7.59],[2.167],[7.042],[10.791],[5.313],[7.997],[5.654],[9.27],[3.1]], dtype=np.float32)
train_Y = np.array([[1.7],[2.76],[2.09],[3.19],[1.694],[1.573],[3.366],[2.596],[2.53],[1.221],[2.827],[3.465],[1.65],[2.904],[2.42],[2.94],[1.3]], dtype=np.float32)
total_samples = train_X.shape[0]
# ================ 3.构建模型 ================
# 输入数据
X = tf.placeholder(tf.float32, [None, 1])
# 模型参数
W = tf.Variable(tf.random_normal([1, 1]), name="weight")
b = tf.Variable(tf.zeros([1]), name="bias")
# 推理值
Y = tf.matmul(X, W) + b
# ================ 4.定义损失函数 ================
# 实际值
Y_ = tf.placeholder(tf.float32, [None, 1])
# 均方差
loss = tf.reduce_sum(tf.pow(Y-Y_, 2))/(2*total_samples)
# ================ 5.创建优化器 ================
# 随机梯度下降优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
# ================ 6.定义单步训练操作 ================
# 最小化损失值
train_op = optimizer.minimize(loss)
# ================ 7.创建会话 ================
with tf.Session() as sess:
    # 初始化全局变量
    sess.run(tf.global_variables_initializer()) 
# ================ 8.迭代训练 ================
    print("Start training:")
    for step in xrange(max_train_steps):
        sess.run(train_op, feed_dict={X: train_X, Y_: train_Y})
        # 每隔log_step步打印一次日志
        if step % log_step == 0:
            c = sess.run(loss, feed_dict={X: train_X, Y_:train_Y})
            print("Step:%d, loss==%.4f, W==%.4f, b==%.4f" % 
                    (step, c, sess.run(W), sess.run(b)))
    # 计算训练完毕的模型在训练集上的损失值,作为指标输出
    final_loss = sess.run(loss, feed_dict={X: train_X, Y_: train_Y})
    # 计算训练完毕的模型参数W和b
    weight, bias = sess.run([W, b])
    print("Step:%d, loss==%.4f, W==%.4f, b==%.4f" % 
            (max_train_steps, final_loss, sess.run(W), sess.run(b)))
    print("Linear Regression Model: Y==%.4f*X+%.4f" % (weight, bias))
# ================ 模型可视化 ================
    # 初始化Matplotlib后端
    %matplotlib
    # 根据训练数据X和Y,添加对应的红色圆点
    plt.plot(train_X, train_Y, 'ro', label='Training data')
    # 根据模型参数和训练数据,添加蓝色(缺省色)拟合直线
    plt.plot(train_X, weight * train_X + bias, label='Fitted line')
    # 添加图例说明
    plt.legend()
    # 画出上面定义的图案
    plt.show()

这段代码在Google的colab上运行会出现问题。

TclError: no display name and no $DISPLAY environment variable

stackoverflow上有人给出了解决方案,提到是matplotlib使用的后端默认选择Xwindows?因此需要将其后端改成Agg,具体解决方案有以下几种:
1. 需要在引入pyplot之前使用

import matplotlib
matplotlib.use('Agg')
  1. 直接在.config/matplotlib/matplotlibrc修改:
backend : Agg
  1. 在远程连接时选择使用Xwindows
ssh -X ...

关于Xwindows可看X窗口系统

这里主要深入探讨以下关于matplotlib的后端(Backend)。
matplotlib经常用在python shell中用作交互式编程,也有将其作为类似wxpython和pygtk这样的图形化界面使用,也有将其用在网络应用服务器中动态提供图片。因此为了能够包含所有的这些需求,matplotlib提供了指向不同输出的后端,相对应的前端就是用户编写使用的代码接口。后端包含两类,一类是user interface backends(用于pygtk, wxpython, tkinter, qt4, or macosx这类的交互式后端),另一类则是hardcopy backends(主要用于PNG, SVG, PDF, PS这类图片渲染并保存)。

matplotlib提供了四种方法来设置后端,如果设置之间相互冲突了,使用use()会覆盖matplotlibrc中的设置。

backend : WXAgg   # use wxpython with antigrain (agg) rendering
  • 第二种方法:在shell中或者你的程序脚本中设置MPLBACKEND环境变量
> export MPLBACKEND="module://my_backend"
> python simple_plot.py

> MPLBACKEND="module://my_backend" python simple_plot.py

这里设置的后台会覆盖matplotlibrc文件
- 第三种方法:对于单个脚本文件中也可以使用-d命令

> python script.py -dbackend

需要注意的是,这个方法已经被弃用了,推荐使用MPLBACKEND
- 第四种方法:如果你的脚本依赖于一个特殊的后台你可以使用use()

import matplotlib
matplotlib.use('PS')   # generate postscript output by default

需要注意的是,如果你使用这个方法,就必须在引入matplotlib.pyplot之前

下面是支持的一些后端选择

这里写图片描述

这里写图片描述


参考文献

what-is-a-backend,(https://matplotlib.org/faq/usage_faq.html#what-is-a-backend)


知识共享许可协议
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值