关于matplotlib的后端(Backend)
主要是在看《深入理解TensorFlow 架构设计与实现原理》遇到的问题,其中第3章有一段源码。# -*- coding=utf-8 -*-import tensorflow as tfimport matplotlib.pyplot as pltimport numpy as np# 打印日志的步长log_step = 50# ================ 1.定义超参...
主要是在看《深入理解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')
- 直接在
.config/matplotlib/matplotlibrc
修改:
backend : Agg
- 在远程连接时选择使用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
中的设置。
- 第一种方法:
matplotlibrc
文件(具体看Customizing matplotlib)
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 国际许可协议进行许可。
更多推荐
所有评论(0)