1. HOME
  2. ブログ
  3. IT技術
  4. 【後編】YAMLを使ってPyTorchのOptimizerのパラメータ管理をすごく簡単にする方法

【後編】YAMLを使ってPyTorchのOptimizerのパラメータ管理をすごく簡単にする方法

後編~YAML で Optimizer のパラメータ管理が簡単に!~

ArgumentParser などで、Optimizer やパラメータ追加のたびに、いちいちコードを書き換えるのは面倒…

そんな悩みを解決してくれるのが「YAML」です。

Optimizer のパラメータ管理が簡単になるだけでなく、コード自体もより単純でスッキリしたものになります。

前回に引き続き、「YAMLを使ってPyTorchのOptimizerのパラメータ管理をすごく簡単にする方法」をご紹介します!

前編をお読みでない方は、こちらをまずお読みください。

YAML でシンプルなコーディングを実現

さて、これを実現するコード「main3.py」は、冒頭のサンプルコード「main1.py」や「main2.py」よりも複雑で巨大なものなのでしょうか?

いいえ、そんな事はありません。

実は、コードそのものがよりシンプルになります。

YAML を使うための下準備

Pythonバージョンは3.6以上
PyTorchバージョンは1.0以上

環境については、上記を想定しています。

YAML を使えるようにインストールします。

準備はこれだけです。

サンプルコード:main3.py

main3.py の中身は、下記のとおりです。

ご覧のとおり、main1.py や main2.py に比べて、よりシンプルなコードに変更されています。

では、変更箇所を一つ一つ見ていきましょう。

引数を導入する

まずは、「引数の導入」のコードです。

ここでは、設定ファイル「.yaml」を指定する config_path のみを引数として扱っています。

Optimizer を作成する

次は、 make_optimizer で、Optimizer を作成するコードです。

名前空間 optim

ここの optim は、下記のところでインポートされた名前空間です。

optim._dict_ に Optimizer の名前を渡すと、そのクラスを取得できます。

Optimizer のオブジェクトを作成する際に渡した **kwargs に、YAML で設定されたパラメータの値が入ってきます。

設定ファイルを読み込み、make_optimizer に渡す

次は、 main のコードを見てみましょう。

ここでは、設定ファイルを読み込み、返り値の config から取り出した 'optimizer' セクションを make_optimizer に渡します。

この部分は、設定ファイルの YAML がプログラムでどのように処理されていくのか、順番に見ていくとよりわかりやすいでしょう。

パラメータを追加

まずは、パラメータを追加する config2.yaml の内容を思い出して下さい。

YAML 設定ファイルを読み込む

下記のコードで、YAML の設定ファイルが読み込まれ、 config に格納されます。

この configdict オブジェクトです。

Python だとどうなる?

Python では、このようになります。

config['optimizer'] のところは、 'optimizer' をキーとして値を取り出しています。

記述は違っても呼び方は同じ

よって、以下の2つのコードは、まったく同じ呼び方ということになります。

引数の名前が指定されているなら、順番は気にしなくていい

ここで、 name lr momentum それぞれの順番は重要ではありません。

Python では引数の名前が指定されている場合、その順番は関数の宣言通りでなくても良いからです。

よって、YAML の設定ファイルが以下のように記述されていても、同様に動作します。

name は最初に記述しよう

ただし、どの Optimizer 設定にも必須な name は、一番最初に記述しておいた方が違和感が少ないです。

YAML の設定変更だけで、どんなOptimizer もサポート可能

make_optimizer では name で Optimizer のクラスを取り出し、 **kwargs にある残り全てのパラメータをそのまま渡します。

上記のコードが、下記のように実行されているイメージになります。

以上をまとめると、「YAML で指定した name で Optimizer のクラスを取り出し、残り全てのパラメータを、そのクラスのオブジェクトを作るときに渡している」となります。

このやり方だと、どの Optimizer のどのパラメータでも、YAML の設定を変えるだけでサポートできるようになります。

YAMLを使う際の注意点

ここからは、YAML の設定時に注意したいポイントをまとめてみました。

name で指定する Optimizer の名前は PyTorch で定義されているもののみ

例えば、 SGD のところが sgd と書かれていたらエラーになります。

設定できる Optimizer の名前は、下記のリンクで確認できます。

【Github ソースコード】
https://github.com/pytorch/pytorch/blob/master/torch/optim/__init__.py

独自定義のクラスを使いたい場合

また、独自に定義した Optimizer のクラスを取り入れたい場合もあるでしょう。

その時は、「 make_optimizer で、独自の名前空間をはじめにチェックする」などの工夫が必要になります。

Optimizer のパラメータ名は定義されたものを使う

lr を learning_rate など、違う名前で設定したら PyTorch から怒られます。

これは、ソースコードと設定ファイルでパラメータ名が統一されるので、利点でもあります。

Optimizer ごとの設定の詳細は、下記のリンクを参照してください。

【pytorch 公式ドキュメント】
https://pytorch.org/docs/stable/optim.html

「true」と「false」を使う

Python では True と False なのですが、YAML では全て小文字です。

慣れないうちは間違えやすいので、気をつけましょう。

小数点を忘れずに

「1.0e-4」なら OK ですが、「1e-4」と記述すると、Python の str 型として認識されてしまいます。

「1.0」のように、必ず小数点をつけましょう。

ちなみに、「1.e-4」でも大丈夫ですが、「1.0e-4」の方が読みやすいと思います。

list 型は[]を使う

YAML では[0.9, 0.09]は list 型として認識されますが、(0.9, 0.09)は str 型になってしまいます。

Adam の betas パラメータは tuple 型ですが、 list 型で渡しても問題ありません

よって、YAML では [] で記述しましょう。

さいごに

いかがでしょうか?

YAML を使えば、「Optimizer のパラメータ管理」や「簡潔かつ分かりやすいコーディング」が簡単にできます。

また、YAML でパラメータ設定をする方法は、Scheduler や DataLoader にも適用できます。

とても便利なので、ぜひ応用してみてくださいね。

記事を書いた人

\ 3度のメシより技術が好き /
(株)ライトコードは、WEB・アプリ・ゲーム開発に強い「好きを仕事にするエンジニア集団」です。
システム開発依頼・お見積もりはこちらまでお願いします。
また、WEB・スマホ系エンジニアを積極採用中です!
※現在、多数のお問合せを頂いており、返信に、多少お時間を頂く場合がございます。

こちらの記事もオススメ!

ライトコードよりお知らせ

にゃんこ師匠にゃんこ師匠
システム開発のご相談やご依頼はこちら
ミツオカミツオカ
ライトコードの採用募集はこちら
にゃんこ師匠にゃんこ師匠
社長と一杯飲みながらお話してみたい方はこちら
ミツオカミツオカ
フリーランスエンジニア様の募集はこちら
にゃんこ師匠にゃんこ師匠
その他、お問い合わせはこちら
ミツオカミツオカ
   
お気軽にお問い合わせください!せっかくなので、別の記事もぜひ読んでいって下さいね!

一緒に働いてくれる仲間を募集しております!

ライトコードでは、仲間を募集しております!

当社のモットーは「好きなことを仕事にするエンジニア集団」「エンジニアによるエンジニアのための会社」。エンジニアであるあなたの「やってみたいこと」を全力で応援する会社です。

また、ライトコードは現在、急成長中!だからこそ、あなたにお任せしたいやりがいのあるお仕事は沢山あります。「コアメンバー」として活躍してくれる、あなたからのご応募をお待ちしております!

なお、ご応募の前に、「話しだけ聞いてみたい」「社内の雰囲気を知りたい」という方はこちらをご覧ください。

ライトコードでは一緒に働いていただける方を募集しております!

採用情報はこちら

書いた人はこんな人

ライトコードメディア編集部
ライトコードメディア編集部
「好きなことを仕事にするエンジニア集団」の(株)ライトコードのメディア編集部が書いている記事です。

関連記事

採用情報

\ あの有名サービスに参画!? /

バックエンドエンジニア

\ クリエイティブの最前線 /

フロントエンドエンジニア

\ 世界はお前の手の中に・・・ /

モバイルエンジニア

\ サービスの守り神! /

インフラエンジニア