Skip to content

ハイパーパラメータの管理クラス(Configクラス)

概要

  • ハイパーパラメータはConfigクラスなどで管理し、cfg.param1のように参照しておくと、変更しやすい
  • 設定ファイルや引数からの読み込みにも対応させておくと、Optunaによるチューニングなどもしやすい
    • またはconfig.hhにしておいてincludeするなども考えられるが、ビルドし直しが必要になる
  • dump()機能を持たせておくと、実行時の情報をまとめて出力しておける

コード例

struct Config {
    int param1 = 100;
    double param2 = 5.5;

    Config(const char* path = "params.json") {
#ifdef LOCAL
        load_json_file(path);
        dump();
#endif
    }

#ifdef LOCAL
    void load_json_file(const char* path) {
        ifstream fin(path);
        if (!fin) return;
        nlohmann::json j;
        fin >> j;

        param1 = j.value<int>("param1", param1);
        // param1 = j.at("param1").get<int>();
        param2 = j.value<double>("param2", param2);
    }
    void dump() const {
        cerr << "[Config]" << endl;
        cerr << "param1 = " << param1 << endl;
        cerr << "param2 = " << param2 << endl;
    }
    void dump(nlohmann::json& result_json) const {
        result_json["param1"] = param1;
        result_json["param2"] = param2;
    }
#endif
};

params.jsonは以下のように用意。

{
  "param1": 50,
  "param2": 3.4
}

使うときは、以下のように用意。

class Solver {
    const Config cfg;

   public:
    Solver() : cfg() {
    }
};