Path: blob/master/site/ja/tensorboard/scalars_and_keras.ipynb
25115 views
Copyright 2019 The TensorFlow Authors.
TensorBoard のスカラー: Keras でトレーニングメトリックをログする
概要
機械学習には、損失などの主要なメトリック、そしてトレーニングが進むにつれそれらがどのように変化するかを理解することが必ず伴います。こういったメトリックは、過適合が発生していないか、不要に長くトレーニングしていないかなどを理解する上で役立ちます。そのため、モデルのデバッグや改善を行いやすくするために、トレーニングの実行から得られるメトリックを比較すると良いでしょう。
TensorBoard の Time Series ダッシュボードでは、単純な API を使用して簡単にこれらのメトリックを可視化できます。このチュートリアルでは非常に基本的な例を使用して、Keras モデルを開発する際に API と TensorBoard を使用する方法を説明します。Keras TensorBoard コールバックと TensorFlow Summary API を使用して、デフォルトとカスタムのスカラーを可視化する方法を学習します。
セットアップ
簡単な回帰用データをセットアップする
これから Keras を使用して回帰を計算し、データセットペアにおける最適な適合線を見つけたいと思います。(この種の問題でニューラルネットワークと勾配降下を使用するのはやり過ぎではありますが、例を理解しやすくなります。)
TensorBoard を使用して、エポック間でトレーニングとテストの損失がどのように変化するのかを観測します。時間の経過とともにトレーニングとテストの損失が下降して安定化する様子を確認してください。
まず、おおまかに線 y = 0.5x + 2 に沿って 1000 個のデータポイントを生成し、それらをトレーニングセットとテストセットに分割します。ここでは、ニューラルネットワークがこの関係を学習することを目標とします。
モデルをトレーニングして損失をログする
モデルの定義、トレーニング、および評価の準備が整いました。
トレーニングしながら損失スカラーをログするには、次のように行います。
Keras TensorBoard コールバックを作成します。
ログディレクトリを指定します。
TensorBoard コールバックを Keras の Model.fit() に渡します。
TensorBoard は、ログディレクトリ階層からログデータを読み取ります。このノートブックでは、ルートログディレクトリは logs/scalars
で、その後にタイムスタンプ付きのサブディレクトリが続きます。タイムスタンプがサブディレクトリに付加されることで、TensorBoard を使用してモデルでイテレーションを行う際に、トレーニングセットを簡単に識別して選択することができます。
TensorBoard を使って損失を調べる
では、上記で使用したルートログディレクトリを指定して、TensorBoard を起動しましょう。
TensorBoard の UI が読み込まれるまで数秒ほどかかります。
TensorBoard に「No dashboards are active for the current data set(現在のデータセットにはアクティブなダッシュボードはありません)」というメッセージが表示されることがあります。これは、最初のログデータがまだ保存されていないためです。トレーニングが進むにつれ、Keras モデルはデータをログし始めるため、TensorBoard の再読み込みが定期的に行われ、スカラーメトリックが表示されるようになります。それまで待てない方は、右上にある再読み込み矢印をタップしてください。
トレーニングが進むにつれ、トレーニングと検証の損失が急速に下降し、安定する様子が見られます。実際、トレーニングが 25 エポックを終了したところであまり改善が見られなくなるため、その時点でトレーニングを停止することができます。
グラフをホバーし、特定のデータポイントを確認します。マウスを使用して拡大したり、部分的に選択して詳細を確認することも可能です。
左側に「Runs(実行)」セレクタがあります。1 つの「実行」は、1 ラウンドのトレーニングから得たログ一式を指します。このケースでは、これは Model.fit() の結果です。通常、長期間にわたってモデルの実験と開発が行われるため、実行の数は非常に多くなります。
Runs セレクタを使用して特定の実行を選択するか、トレーニングまたは検証のみから選択します。実行を比較すると、どのバージョンのコードで問題の解決が最適に行われているかを評価しやすくなります。
TensorBoard の損失グラフには、トレーニングと検証の両方で損失が一定して下降し、安定したことが示されています。つまり、モデルのメトリックは非常に良質である可能性が高いということです。では、このモデルが実際のデータでどのように動作するかを見てみましょう。
入力データ (60, 25, 2) がある場合、線 y = 0.5x + 2 は (32, 14.5, 3) となるはずです。モデルはこれと合致するでしょうか。
よくできました!
カスタムスカラーをログする
動的学習率などのカスタムの値をログする場合はどうでしょうか。この場合は、TensorFlow Summary API を使用する必要があります。
回帰モデルを維持したまま、カスタム学習率をログします。次のように行ってください。
tf.summary.create_file_writer()
を使ってファイルライターを作成します。カスタム学習率の関数を定義します。この関数は、Keras の LearningRateScheduler コールバックに渡されます。
学習率関数内に、カスタム学習率をログするための
tf.summary.scalar()
を使用します。LearningRateScheduler コールバックを Model.fit() に渡します。
一般的に、カスタムスカラーをログするには、tf.summary.scalar()
をファイルライターとともに使用する必要があります。この実行のデータを特定のディレクトリに書き込むのはファイルライターであり、tf.summary.scalar()
を使用する際にファイルライターが暗黙的に使用されるためです。
もう一度 TensorBoard を確認しましょう。
左側の「Runs」セレクタを使用すると、<timestamp>/metrics
実行が 1 つあります。この実行を選択すると「learning rate(学習率)」グラフが表示され、この実行における学習率の進行を確認することができます。
また、この実行のトレーニングと検証の損失曲線を以前の実行と比較することもできます。また、エポックによっては、学習率スケジュールが離散値を返すことがありますが、学習率プロットは滑らかに見える場合があることに気付くかもしれません。TensorBoard には平滑化パラメーターがあり、平滑化されていない値を表示するには、ゼロまで下げる必要がある場合があります。
このモデルの出来栄えはどうでしょうか。
バッチレベルのロギング
まず MNIST データセットを読み込んでデータを正規化し、画像を 10 個のクラスに分類する単純な Keras モデルを作成する関数を記述しましょう。
バッチレベルの瞬時ロギング
バッチレベルでメトリクスを瞬時にロギングすると、エポックごとにトレーニング中のバッチ間の変動レベルを見ることができます。これは、デバッグの際に役立ちます。
サマリーライターを別のログディレクトリにセットアップします。
バッチレベルのロギングを有効にするには、モデルのクラス定義で train_step()
をオーバーライドしてカスタム tf.summary
メトリクスを定義し、サマリーライターのコンテキストに含める必要があります。これは、以下に示すように、サブクラス化されたモデル定義に単純に結合するか、以前の関数 API モデルを編集して拡張できます。
エポックレベルとバッチレベルのメトリクスをログディレクトリにログし、選択した batch_size
で model.fit()
を呼び出すように TensorBoard コールバックを定義します。
新しいログディレクトリで TensorBoard を開き、エポックレベルとバッチレベルのメトリクスを確認します。
バッチレベルの累積ロギング
バッチレベルのロギングは、累積して実装することも可能です。バッチのメトリクスと前のメトリクスを平均化することで、バッチレベルのメトリクスをロギングする際に、より滑らかなトレーニング曲線が描かれます。
サマリーライターを別のログディレクトリにセットアップします。
バッチごとにログできるステートフルメトリクスを作成します。
前と同様に、オーバーライドされた train_step
にカスタム tf.summary
メトリクスを追加します。バッチレベルのロギングを累積して行うために、定義したステートフルメトリクスを使って、各トレーニングステップのデータに基づく累積結果を計算します。
前と同様に、TensorBoard コールバックを定義して、選択した batch_size
で model.fit()
を呼び出します。
新しいログディレクトリで TensorBoard を開き、エポックレベルとバッチレベルのメトリクスを確認します。
これで完了です!様々なユースケースに使用するカスタムトレーニングメトリクスを TensorBoard に作成する方法を学習しました。