我目前正在OpenAI gym等环境中尝试不同的RL算法。目前我只使用自己实现的环境和代码,因为它有助于我了解事情是如何运作的。
现在我正在寻找一种记录和存储在多集剧集中创建的所有数据的好方法。
一些例子:
我考虑过使用python日志记录模块,尽管它可能用于不同的用途。此外,我还考虑使用观察者模式将事件(代理人采取行动,新状态,剧集结束等)推送给我作为观察员附加的不同记录器。
是否有更好的方法来实现此功能? 或者也许我可以从中学到一些很好的示例代码?
使用记录模块是个好主意吗?我认为这可能是有益的,因为我可以控制记录的内容或打开或关闭登录。但如果我使用观察者模式,我真的不需要这个。
此致 大卫
答案 0 :(得分:1)
大多数人根据他们的需要从头开始实施这些实验。您可能希望引用BURLAP(一种流行的Java RL库)构建其绘图的方式(它不会记录,但在任何一种情况下都需要相同的信息)。示例实验设置为here。
通常情况下,我会创建一个课程,让我能够快速获取某些观察序列的手段/信心,无论是剧集奖励还是评估步骤等等。
from typing import List
import numpy as np
import scipy as scipy
import scipy.stats
class ExperimentLog():
def __init__(self, series: List[float], signfigance_level: float):
self.means = []
self.variances = []
self.confidences = []
self.n = 1
self.current_observation_num = 0
self.series = series
self.signfigance_level = signfigance_level
def observe(self, value: float):
mean = None
variance = None
if self.current_observation_num > len(self.means) - 1:
self.means.append(0.0)
self.variances.append(0.0)
mean = 0.0
variance = 0.0
else:
mean = self.means[self.current_observation_num]
variance = self.variances[self.current_observation_num]
delta = value - mean
mean += delta / self.n
variance += delta * (value - mean)
self.means[self.current_observation_num] = mean
self.variances[self.current_observation_num] = variance
self.current_observation_num += 1
def finalize_confidences(self):
assert self.n > 1
self.variances = [variance / (self.n - 1) for variance in
self.variances]
for (mean, variance) in zip(self.means, self.variances):
crit = scipy.stats.t.ppf(1.0 - self.signfigance_level, self.n - 1)
width = crit * np.math.sqrt(variance) / np.math.sqrt(self.n)
self.confidences.append(width)
def observe_trial_end(self):
self.n += 1
self.current_observation_num = 0
我直接在学习或评估循环中填充它。然后将它保存到文件很简单:
def save(name, log: ExperimentLog, out_dir: str, unique_num: int = 0):
out_prefix = out_dir
if not os.path.exists(out_prefix):
os.makedirs(out_prefix)
filename = str(experiment_num) + "_" + str(num_trials) + "_" + name + str(unique_num) + ".csv"
full_out_path = os.path.join(out_prefix, filename)
if log.n > 1:
log.finalize_confidences()
data = np.c_[(log.series, log.means, log.variances, log.confidences)]
else:
data = np.c_[(log.series, log.means)]
np.savetxt(full_out_path, data,
fmt=["%d", "%f", "%f", "%f"],
delimiter=",")