PyTorch Ignite 0.4.8 : 概要

PyTorch Ignite 0.4.8 : 概要 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 03/01/2022 (0.4.8)

* 本ページは、PyTorch Ignite の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

  • 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
  • sales-info@classcat.com  ;  Web: www.classcat.com  ;   ClassCatJP

 

PyTorch Ignite 0.4.8 : 概要

TL;DR

Ignite は柔軟に透過的に PyTorch のニューラルネットワークを訓練して評価するのに役立つ高位ライブラリです。

 

特徴

  • 最大限の制御と単純性を保証しながら、純粋な PyTorch よりも少ないコード
  • ライブラリ・アプローチ、そしてプログラムの制御反転はありません – 必要なところで必要なときに ignite を使用してください
  • メトリクス、実験マネージャ、そして他のコンポーネントのための拡張可能な API

 

Why Ignite?

Ignite は 3 つの高位の機能を提供する ライブラリ です :

  • 非常に単純なエンジンとイベントシステム
  • モデルを容易に評価するための out-of-the-box なメトリクス
  • 訓練パイプラインを構成し、アーティファクトをセーブしてパラメータとメトリクスをログ記録するための組込みハンドラ

 

単純化された訓練と検証ループ

エポックと反復の for/while ループをコーディングする必要は最早ありません。ユーザはエンジンをインスタンス化してそれらを実行します。

from ignite.engine import Engine, Events, create_supervised_evaluator
from ignite.metrics import Accuracy


# Setup training engine:
def train_step(engine, batch):
    # Users can do whatever they need on a single iteration
    # Eg. forward/backward pass for any number of models, optimizers, etc
    # ...

trainer = Engine(train_step)

# Setup single model evaluation engine
evaluator = create_supervised_evaluator(model, metrics={"accuracy": Accuracy()})

def validation():
    state = evaluator.run(validation_data_loader)
    # print computed metrics
    print(trainer.state.epoch, state.metrics)

# Run model's validation at the end of each epoch
trainer.add_event_handler(Events.EPOCH_COMPLETED, validation)

# Start the training
trainer.run(training_data_loader, max_epochs=100)

 

イベント & ハンドラのパワー

ハンドラによるクールなことはそれらが (例えばコールバックと比較して) 比類ない柔軟性を提供することです。ハンドラは任意の関数であり得ます : e.g. lambda, 単純な関数、クラスメソッド等。これにより、インターフェイスから継承してその抽象メソッドを override する必要はありません、それは貴方のコードとその複雑さを不必要に増大させる可能性があります。

 

望むときにはいつでも任意の数の関数を実行します

trainer.add_event_handler(Events.STARTED, lambda _: print("Start training"))

# attach handler with args, kwargs
mydata = [1, 2, 3, 4]
logger = ...

def on_training_ended(data):
    print(f"Training is ended. mydata={data}")
    # User can use variables from another scope
    logger.info("Training is ended")


trainer.add_event_handler(Events.COMPLETED, on_training_ended, mydata)
# call any number of functions on a single event
trainer.add_event_handler(Events.COMPLETED, lambda engine: print(engine.state.times))

@trainer.on(Events.ITERATION_COMPLETED)
def log_something(engine):
    print(engine.state.output)

 

組込みイベント・フィルタリング

# run the validation every 5 epochs
@trainer.on(Events.EPOCH_COMPLETED(every=5))
def run_validation():
    # run validation

# change some training variable once on 20th epoch
@trainer.on(Events.EPOCH_STARTED(once=20))
def change_training_variable():
    # ...

# Trigger handler with customly defined frequency
@trainer.on(Events.ITERATION_COMPLETED(event_filter=first_x_iters))
def log_gradients():
    # ...

 

幾つかのアクションを共有するためにイベントをスタックする

複数の呼び出しを有効にするためにイベントは一緒にスタックできます :

@trainer.on(Events.COMPLETED | Events.EPOCH_COMPLETED(every=10))
def run_validation():
    # ...

 

標準イベントを越えるためのカスタムイベント

backward と optimizer ステップに関連するカスタムイベント :

from ignite.engine import EventEnum

class BackpropEvents(EventEnum):
    BACKWARD_STARTED = 'backward_started'
    BACKWARD_COMPLETED = 'backward_completed'
    OPTIM_STEP_COMPLETED = 'optim_step_completed'

def update(engine, batch):
    # ...
    loss = criterion(y_pred, y)
    engine.fire_event(BackpropEvents.BACKWARD_STARTED)
    loss.backward()
    engine.fire_event(BackpropEvents.BACKWARD_COMPLETED)
    optimizer.step()
    engine.fire_event(BackpropEvents.OPTIM_STEP_COMPLETED)
    # ...

trainer = Engine(update)
trainer.register_events(*BackpropEvents)

@trainer.on(BackpropEvents.BACKWARD_STARTED)
def function_before_backprop(engine):
    # ...

 

Out-of-the-box メトリクス

precision = Precision(average=False)
recall = Recall(average=False)
F1_per_class = (precision * recall * 2 / (precision + recall))
F1_mean = F1_per_class.mean()  # torch mean method
F1_mean.attach(engine, "F1")

 

インストール

From pip:

pip install pytorch-ignite

From conda:

conda install ignite -c pytorch

From source:

pip install git+https://github.com/pytorch/ignite

 

Getting Started

Few pointers to get you started:

 

ドキュメント

 

追加資料

 

サンプル

チュートリアル

 

再現性のある訓練サンプル

torchvision/references に触発され、ビジョンタスクのための幾つかの再現性のあるベースラインを提供します :

  • ImageNet – logs on Ignite Trains server coming soon …
  • Pascal VOC2012 – logs on Ignite Trains server coming soon …

機能 :

 

コード生成アプリケーション

PyTorch-Ignite で訓練スクリプトを作成する最も簡単な方法は :

 

Citing Ignite

(訳注: 原文 参照)

 

以上