視覚化に TensorBoard を使用する

TensorBoard は、ディープ ラーニング プログラムの理解とデバッグを容易にする視覚化ツールのスイートです。 たとえば、モデル グラフを表示したり、トレーニングの進行に合ったさまざまなスカラー値をプロットしたり、埋め込みを視覚化したりできます。

Python

Python の TensorBoardProgressWriter クラスでネイティブ TensorBoard 形式の出力がサポートされるようになりました。これにより、CNTK ジョブの豊富な視覚化機能が有効になりました。 現在、TensorBoardProgressWriter は次の目的で使用できます。

  • モデル グラフを記録します。
  • トレーニング中に任意のスカラー値を記録します。
  • トレーニング中に損失関数とエラー率の値を自動的に記録します。
  • 画像の表示 (v2.2 以降)

CNTK model graph as displayed in TensorBoard.

Loss and error rate logged from CNTK and displayed in TensorBoard.

Images logged from CNTK and displayed in TensorBoard.

まず、次の引数のいくつかを指定して TensorBoardProgressWriter クラスをインスタンス化する必要があります。

  • freq – 出力ファイルにログを記録する頻度。 たとえば、値 2 を指定すると、2 回目の呼び出しごとに update メソッドがディスクに書き込まれます。
  • log_dir - 出力ファイルが作成されるディレクトリ。
  • rank - 分散トレーニングの場合、これはワーカーのランクに設定する必要があります。 設定した場合、TensorBoardProgressWriter はワーカー 0 からの進行状況のみが記録されるようにします。
  • model – 視覚化するCNTK モデル。

たとえば、次の行は TensorBoardProgressWriter をインスタンス化します。この場合、"log" ディレクトリにファイルが作成され、10 回の呼び出しごとにディスクに書き込まれます。 また、後で視覚化するためにmy_modelのグラフも保持されます。

tensorboard_writer = TensorBoardProgressWriter(freq=10, log_dir=’log’, model=my_model)

その後、構築時にトレーナーに上記のオブジェクトを提供する必要があります。

trainer = Trainer(my_model, (ce, pe), learner, tensorboard_writer)

Trainer オブジェクトは、各ミニバッチでのトレーニング/テスト後に、TensorBoardProgressWriter を損失/評価メトリックの値で更新します。 したがって、これらの値を記録するために TensorBoardProgressWriter を明示的に呼び出す必要はありません。 その他のスカラー値を記録するには、 write_value() メソッドを使用します。次に例を示します。

    # Log mean of each parameter tensor, to confirm that the parameters change indeed.
    # Don't want to do that very often though, not to spend too much time computing the mean.
    if minibatch_idx % 10000 == 0:
        for p in my_model.parameters:
            tensorboard_writer.write_value(p.uid + "/mean",  reduce_mean(p).eval(), minibatch_idx)

CNTK 2.2 以降、CNTKには TensorBoard イメージ機能を使用できます。 画像を表示するには、TensorBoardProgressWriter.write_image() メソッドを呼び出す必要があります。 次の例では、TensorBoard を使用して MNIST データ セットの画像を表示します。

まず、MNIST データ セットから画像を読み取り、モデル入力の一部としてフィードします。

    # Input variables denoting the features and label data
    input_var = C.ops.input_variable((num_channels, image_height, image_width), np.float32)
    label_var = C.ops.input_variable(num_output_classes, np.float32)

    # Create a model
    with C.layers.default_options(activation=C.ops.relu, pad=False):
        conv1 = C.layers.Convolution2D((5, 5), 32, pad=True)(scaled_input)
       ...

    #load image data as model input
    reader_train = create_reader(os.path.join(data_path, 'minist_data_set_file'), True, input_dim,
                                 num_output_classes)
    input_map = {
        input_var: reader_train.streams.features,
        label_var: reader_train.streams.labels
    }

イメージを tensorboard にシリアル化するには、トレーニング中にイメージ変数をフェッチし、TensorBoardProgressWriter.write_image() を呼び出して表示する必要があります。 次の例では、中間変数をイメージとしてフェッチできます。次の例では、input_varにシリアル化するイメージが含まれます。

    for epoch in range(max_epochs): 
        sample_count = 0
        while sample_count < epoch_size:  
	    #train the model using input data
            data = reader_train.next_minibatch(min(minibatch_size, epoch_size - sample_count),
                                               input_map=input_map)
	    #Store input data in the output  
            output = trainer.train_minibatch(data, outputs=[input_var])  

	    #Write output images to tensorboard
	    tensorboard_writer.write_image('training', output[1], sample_count)

TensorBoard は CNTK パッケージの一部ではなく、個別にインストールする必要があります。 インストール後、トレーニング ジョブが開始されたら、次のコマンドを実行して TensorBoard を起動して進行状況を監視できます。

    tensorboard --logdir=log

(スクリプトの作業ディレクトリからコマンドが実行されると仮定して)、お気に入りの Web ブラウザーに http://localhost:6006/ 移動します。

次のスクリプトには、TensorBoardProgressWriter の使用方法の例が含まれています。

例/Image/Classification/MLP/Python/SimpleMNIST.py
Examples/Image/Classification/ResNet/Python/TrainResNet_CIFAR10.py
Examples/Image/Classification/ConvNet/Python/ConvNet_CIFAR10_DataAug_Distributed.py
Examples/LanguageUnderstanding/ATIS/Python/LanguageUnderstanding.py

BrainScript

また、BrainScript からトレーニングの進行状況とモデル グラフをログに記録するようにCNTKに指示することもできます。 SGD ブロック 制御 TensorBoard 出力の次の 2 つの設定:

  • tensorBoardLogDir - TensorBoard イベント ファイルを作成する必要があるディレクトリ。 既定では、この値は空です。つまり、TensorBoard の出力はありません。
  • tensorBoardNumMBsToLogResult - 中間 (ミニバッチごとの) 損失/評価メトリックが TensorBoard に記録される頻度。 この設定は、 tensorBoardLogDir が空でない場合にのみ使用されます。 既定では、 numMBsToShowResult と同じ値が使用されます。 これを 0 に設定すると、中間出力は発生せず、エポックごとの統計のみが返されます。これを正の整数 N に設定すると、N 個のミニバッチごとに TensorBoard の進行状況が出力されます。

通常、コマンド ラインからCNTKを起動するときに、これらの設定を渡します。

    CNTK.exe configFile=myConfig tensorBoardLogDir=log tensorBoardNumMBsToLogResult=10