python - 在 python 中记录/存储强化学习实验的结果/指标的好方法?

标签 python logging analytics reinforcement-learning

我目前正在像 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/

相关文章:

C# 条件日志记录/跟踪

java - 哪个工具可以收集和显示应用程序跟踪和异常?

sql - 具有多个输入的 Azure 流分析查询

java - 算法的原语运算

如果不是重复行,Bash 添加到文件末尾 (>>)

javascript - 如何使用 javascript 跟踪在解析分析中打开的应用程序?

python - 当 n % k > 0 时,将 n 长列表分成 k 长 block 的简单习语?

python - Elasticsearch 中的自定义直方图聚合

python - matplotlib:在刻度标签中使用固定的小数位数和科学记数法

python - IPython 从 Ubuntu 到 Windows UNC 路径