我目前正在像 OpenAI gym 中的环境中试验不同的 RL 算法。 .目前我只使用我自己实现的环境和代码,因为它可以帮助我理解事情是如何工作的。
现在我正在寻找一种记录和存储在许多情节过程中创建的所有数据的好方法。
几个例子:
- 访问过的州
- 失去我的神经网络
- 步数/集数
- 每集奖励
我考虑过使用 python 日志记录模块,尽管它可能用于不同的用途。我还考虑过使用观察者模式将事件(代理采取行动、新状态、剧集结束等)推送到我作为观察者附加的不同记录器。
有没有更好的方法来实现这个功能? 或者也许有一些很好的示例代码可供我学习?
使用日志模块是个好主意吗?我认为这可能是有益的,因为我可以控制记录的内容或打开或关闭日志记录。但如果我使用观察者模式,我真的不需要这个。
真诚的 大卫
最佳答案
大多数人根据自己的需要从头开始实现他们的实验。您可能想引用方式 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=",")
关于python - 在 python 中记录/存储强化学习实验的结果/指标的好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40319152/