绘图利器——Seaborn
强化学习的paper中离不开各种数据的可视化,绘图中如何对数据进行处理、平滑是个很重要的问题。
人类高质量图片:
人类低质量图片:
那么如何绘制出一张高质量的图片呢?这里介绍一个绘图常用的Python库——Seaborn
首先是库的安装
pip install seaborn
接着是库的使用,可以参考以下文章:
官方链接
深度强化学习实验中的paper绘图方法
10分钟python图表绘制 | seaborn入门
使用方法基本就是链接中博客所介绍的那样,这里主要是针对链接深度强化学习实验中的paper绘图方法中提到的smooth函数进行一些修改,个人觉得链接中,smooth函数是有点问题的,绘制出的图像在结尾处会出现下降的情况。
贴出原博客代码
def smooth(data, sm=1):
if sm > 1:
smooth_data = []
for d in data:
y = np.ones(sm)*1.0/sm
d = np.convolve(y, d, "same")
smooth_data.append(d)
return smooth_data
以上面TD3论文中的数据为例(数据链接),使用此函数对图中(d) Ant-v1进行绘制,图片如下所示:
smooth前:
smooth后:
可以很明显看到,数据经过处理后,已经变得很平滑。但是绘制出的结果和论文还是有一定差距的。经过分析发现,问题出现在smooth函数中的卷积部分,将代码进行如下修改:
def smooth(data, sm=1):
smooth_data = []
if sm > 1:
for d in data:
z = np.ones(len(d))
y = np.ones(sm)*1.0
d = np.convolve(y, d, "same")/np.convolve(y, z, "same")
smooth_data.append(d)
return smooth_data
再次绘制:
可以看到,图像与论文结果一致。成功解决了这个问题。
贴出自己的绘图代码:
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
linestyle = ['-', '--', ':', '-.']
color = ['r', 'g', 'b', 'k']
label = ['algo1', 'algo2', 'algo3', 'algo4']
def smooth(data, sm=1):
smooth_data = []
if sm > 1:
for d in data:
z = np.ones(len(d))
y = np.ones(sm)*1.0
d = np.convolve(y, d, "same")/np.convolve(y, z, "same")
smooth_data.append(d)
return smooth_data
data = []
# 下载好数据后,根据自己文件路径,修改np.load()中的代码路径
data1 = np.load("E:\Github Download code\TD3-master\learning_curves\Ant\TD3_Ant-v1_0.npy").tolist()
data2 = np.load("E:\Github Download code\TD3-master\learning_curves\Ant\TD3_Ant-v1_1.npy").tolist()
data3 = np.load("E:\Github Download code\TD3-master\learning_curves\Ant\TD3_Ant-v1_2.npy").tolist()
data4 = np.load("E:\Github Download code\TD3-master\learning_curves\Ant\TD3_Ant-v1_3.npy").tolist()
data5 = np.load("E:\Github Download code\TD3-master\learning_curves\Ant\TD3_Ant-v1_4.npy").tolist()
data6 = np.load("E:\Github Download code\TD3-master\learning_curves\Ant\TD3_Ant-v1_5.npy").tolist()
data7 = np.load("E:\Github Download code\TD3-master\learning_curves\Ant\TD3_Ant-v1_6.npy").tolist()
data8 = np.load("E:\Github Download code\TD3-master\learning_curves\Ant\TD3_Ant-v1_7.npy").tolist()
data9 = np.load("E:\Github Download code\TD3-master\learning_curves\Ant\TD3_Ant-v1_8.npy").tolist()
data10 = np.load("E:\Github Download code\TD3-master\learning_curves\Ant\TD3_Ant-v1_9.npy").tolist()
data.append(data1)
data.append(data2)
data.append(data3)
data.append(data4)
data.append(data5)
data.append(data6)
data.append(data7)
data.append(data8)
data.append(data9)
data.append(data10)
y_data = smooth(data, 19)
x_data = np.arange(0, 1e6+5000, 5000)
sns.set(style="darkgrid", font_scale=1.5)
sns.tsplot(time=x_data, data=y_data, color=color[2], linestyle=linestyle[0])
个人经验
在绘制奖励函数时,尽量让y轴数据变得丰富,一个技巧是选取不同随机数种子,在不同种子下对算法进行测试,将每次种子下,产生的数据进行保存,最后再进行统一处理。
数据格式可以为:
y_data=[[seed1产生的奖励], [seed2产生的奖励], ..., [seedn产生的奖励]]
smooth_data = smooth(y_data, sm)