热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Seaborn绘图】深度强化学习实验中的paper绘图方法

来源:知乎(zhuanlan.zhihu.comp75477750)编辑:DeepRL强化学习实验中的绘图技巧-使用seaborn绘制paper中的图片,

来源:知乎(zhuanlan.zhihu.com/p/75477750)

编辑: DeepRL

强化学习实验中的绘图技巧-使用seaborn绘制paper中的图片,使用seaborn绘制折线图时参数数据可以传递ndarray或者pandas,不同的源数据对应的其他参数也略有不同.

1. ndarray

先看一个小例子

def getdata(): basecond = [[18, 20, 19, 18, 13, 4, 1], [20, 17, 12, 9, 3, 0, 0], [20, 20, 20, 12, 5, 3, 0]]cond1 = [[18, 19, 18, 19, 20, 15, 14], [19, 20, 18, 16, 20, 15, 9], [19, 20, 20, 20, 17, 10, 0], [20, 20, 20, 20, 7, 9, 1]]cond2 = [[20, 20, 20, 20, 19, 17, 4], [20, 20, 20, 20, 20, 19, 7], [19, 20, 20, 19, 19, 15, 2]]cond3 = [[20, 20, 20, 20, 19, 17, 12], [18, 20, 19, 18, 13, 4, 1], [20, 19, 18, 17, 13, 2, 0], [19, 18, 20, 20, 15, 6, 0]]return basecond, cond1, cond2, cond3

数据维度都为(3,7)或(4, 7) 

第一个维度表示每个时间点采样不同数目的数据(可认为是每个x对应多个不同y值) 第二个维度表示不同的时间点(可认为是x轴对应的x值)

data = getdata()
fig = plt.figure()
xdata = np.array([0, 1, 2, 3, 4, 5, 6])/5
linestyle = ['-', '--', ':', '-.']
color = ['r', 'g', 'b', 'k']
label = ['algo1', 'algo2', 'algo3', 'algo4']for i in range(4): sns.tsplot(time=xdata, data=data[i], color=color[i], linestyle=linestyle[i], condition=label[i])

sns.tsplot 用来画时间序列图

time参数表示对应的时间轴(ndarray),即x轴,data即要求绘制的数据,上述例子为(3, 7)或(4, 7),color为每条线的颜色,linestyle为每条线的样式,condition为每条线的标记.

plt.ylabel("Success Rate", fontsize=25)
plt.xlabel("Iteration Number", fontsize=25)
plt.title("Awesome Robot Performance", fontsize=30)
plt.show()

1.2 绘图建议

  • 你的程序代码需要使用一个额外的文件记录结果,例如csv或pkl文件,而不是直接产生最终的绘图结果.这种方式下,你能运行程序代码一次,然后以不同的方式去绘制结果,记录超出您认为严格必要的内容可能是一个好主意,因为您永远不知道哪些信息对于了解发生的事情最有用.注意文件的大小,但通常最好记录以下内容:每次迭代的平均reward或loss,一些采样的轨迹,有用的辅助指标(如贝尔曼误差和梯度)

  • 你需要有一个单独的脚本去加载一个或多个记录文件来绘制图像,如果你使用不同的超参数或随机种子运行算法多次,一起加载所有的数据(也许来自不同的文件)并画在一起是个好主意,使用自动生成的图例和颜色模式使分辨不同的方法变得容易.

  • 深度强化学习方法,往往在不同的运行中有巨大的变化,因此使用不同的随机种子运行多次是一个好主意,在绘制多次运行的结果时,在一张图上绘制不同运行次的结果,通过使用不同粗细和颜色的线来分辨.在绘制不同的方法时,你将发现将他们总结为均值和方差图是容易的,然而分布并不总是遵循正态曲线,所以至少在初始时有明显的感觉对比不同随机种子的性能.

1.3 实验绘图流程

下面以模仿学习的基础实验为例

means = []
stds = []
#使用不同的随机种子表示运行多次实验
for seed in range(SEED_NUM): tf.set_random_seed(seed*10) np.random.seed(seed*10) mean = [] std = []#构建神经网络模型model = tf.keras.Sequential() model.add(layers.Dense(64, activation="relu")) model.add(layers.Dense(64, activation="relu")) model.add(layers.Dense(act_dim, activation="tanh")) model.compile(optimizer=tf.train.AdamOptimizer(0.0001), loss="mse", metrics=['mae']) #迭代次数for iter in range(ITERATION): print("iter:", iter) #训练模型model.fit(train, label, batch_size=BATCH_SIZE, epochs=EPOCHS)#测试,通过与环境交互n次而成,即n趟轨迹roll_reward = [] for roll in range(NUM_ROLLOUTS): s = env.reset() done = False reward = 0 step = 0 #以下循环表示一趟轨迹while not done: a = model.predict(s[np.newaxis, :]) s, r, done, _ = env.step(a) reward += r step += 1 if step >= max_steps: break#记录每一趟的总回报值roll_reward.append(reward) #n趟回报的平均值和方差作为这次迭代的结果记录mean.append(np.mean(roll_reward)) std.append(np.std(roll_reward)) #记录每一次实验,矩阵的一行表示一次实验每次迭代结果means.append(mean) stds.append(std)

接着需要保存数据为pkl文件

d = {"mean": means, "std": stds}
with open(os.path.join("test_data", "behavior_cloning_" + ENV_NAME+".pkl"), "wb") as f:pickle.dump(d, f, pickle.HIGHEST_PROTOCOL)

绘图的程序代码比较简单

file = "behavior_cloning_" + ENV_NAME+".pkl"with open(os.path.join("test_data", file), "rb") as f:data = pickle.load(f)x1 = data["mean"]file = "dagger_" + ENV_NAME+".pkl"with open(os.path.join("test_data", file), "rb") as f:data = pickle.load(f)x2 = data["mean"]time = range(10)sns.set(style="darkgrid", font_scale=1.5)sns.tsplot(time=time, data=x1, color="r", condition="behavior_cloning")sns.tsplot(time=time, data=x2, color="b", condition="dagger")plt.ylabel("Reward")plt.xlabel("Iteration Number")plt.title("Imitation Learning")plt.show()

有时我们需要对曲线进行平滑

def smooth(data, sm=1):if sm > 1:smooth_data = []for d in data:y = np.ones(sm)*1.0/smd = np.convolve(y, d, "same")smooth_data.append(d)return smooth_data

sm表示滑动窗口大小,为2*k+1,

smoothed_y[t] = average(y[t-k], y[t-k+1], ..., y[t+k-1], y[t+k])

2.pandas

sns.tsplot可以使用pandas源数据作为数据输入,当使用pandas作为数据时,time,value,condition,unit选项将为pandas数据的列名.

其中time选项给出使用该列Series作为x轴数据,value选项表示使用该Series作为y轴数据,用unit来分辨这些数据是哪一次采样(每个x对应多个y),用condition选项表示这些数据来自哪一条曲线.

在openai 的spinning up中,将每次迭代的数据保存到了txt文件中,类似如下:

可以使用pd.read_table读取这个以"\t"分割的文件形成pandas

algo = ["ddpg_" + ENV, "td3_" + ENV, "ppo_" + ENV, "trpo_" + ENV, "vpg_" + ENV, "sac_" + ENV]data = []for i in range(len(algo)):for seed in range(SEED_NUM):file = os.path.join(os.path.join(algo[i], algo[i] + "_s" + str(seed*10)), "progress.txt")pd_data = pd.read_table(file)pd_data.insert(len(pd_data.columns), "Unit", seed)pd_data.insert(len(pd_data.columns), "Condition", algo[i])data.append(pd_data)data = pd.concat(data, ignore_index=True)sns.set(style="darkgrid", font_scale=1.5)sns.tsplot(data=data, time="TotalEnvInteracts", value="AverageEpRet", condition="Condition", unit="Unit")#数据大时使用科学计数法xscale = np.max(data["TotalEnvInteracts"]) > 5e3if xscale:plt.ticklabel_format(style='sci', axis='x', scilimits=(0, 0))plt.legend(loc='best').set_draggable(True)plt.tight_layout(pad=0.5)plt.show()

程序参考了spinning up 的代码逻辑github.com/openai/spinn

绘制效果如下:

完整代码:https://github.com/feidieufo/homework/tree/master/hw1


推荐阅读
  • 我在尝试将组合框转换为具有自动完成功能时遇到了一个问题,即页面上的列表框也被转换成了自动完成下拉框,而不是保持原有的多选列表框形式。 ... [详细]
  • 本文详细介绍了如何在PyQt5中创建简易对话框,包括对话框的基本结构、布局管理以及源代码实现。通过实例代码,展示了如何设置窗口部件、布局方式及对话框的基本操作。 ... [详细]
  • td{border:1pxsolid#808080;}参考:和FMX相关的类(表)TFmxObjectIFreeNotification ... [详细]
  • 经过半年的精心整理,我们汇总了当前市场上最全面的Android面试题解析,为移动开发人员的晋升和加薪提供了宝贵的参考资料。本书详细涵盖了从基础到高级的各类面试题,帮助读者全面提升技术实力和面试表现。章节目录包括:- 第一章:Android基础面试题- 第二章:... ... [详细]
  • 本文将详细介绍如何配置并整合MVP架构、Retrofit网络请求库、Dagger2依赖注入框架以及RxAndroid响应式编程库,构建高效、模块化的Android应用。 ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • Android与JUnit集成测试实践
    本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ... [详细]
  • 新浪微博热搜暂停更新;即刻APP回归;Android 11 Beta版发布 | 科技新闻速递
    为您带来最新的科技资讯,涵盖社交媒体动态、软件更新及行业重大事件。CSDN携手您共同关注科技前沿。 ... [详细]
  • 目录预备知识导包构建数据集神经网络结构训练测试精度可视化计算模型精度损失可视化输出网络结构信息训练神经网络定义参数载入数据载入神经网络结构、损失及优化训练及测试损失、精度可视化qu ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 从2019年AI顶级会议最佳论文,探索深度学习的理论根基与前沿进展 ... [详细]
  • 理工科男女不容错过的神奇资源网站
    十一长假即将结束,你的假期学习计划进展如何?无论你是在家中、思念家乡,还是身处异国他乡,理工科学生都不容错过一些神奇的资源网站。这些网站提供了丰富的学术资料、实验数据和技术文档,能够帮助你在假期中高效学习和提升专业技能。 ... [详细]
  • 在Dota2AI开发(一)环境配置中介绍了如何搭建Dota2AI的开发环境,在这篇文章中,主要介绍Dota2中AI的常规控制方式,并介绍如何在人机比赛中配置一个裸跳刀的Sven。常用指令 ... [详细]
author-avatar
圣换少爷
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有