Path: blob/master/site/ja/tensorboard/image_summaries.ipynb
25115 views
Copyright 2019 The TensorFlow Authors.
TensorBoard で画像データを表示する
概要
TensorFlow Image Summary API を使用すると、テンソルと任意の画像のログと TensorBoard での表示を簡単に行えるようになります。入力データをサンプリングして調べる場合や、レイヤーの重みや生成されたテンソルを視覚化する場合に非常に有用です。また、診断データを画像としてログすることもできるため、モデル開発時に役立ちます。
このチュートリアルでは、Image Summary API を使用してテンソルを画像として視覚化する方法を学習します。また、任意の画像からテンソルに変換し、それを TensorBoard で視覚化する方法も学習します。モデルのパフォーマンスを理解しやすいように、Image Summary を使用する単純な実際の例を使って作業します。
セットアップ
Fashion-MNIST データセットをダウンロードする
Fashion-MNIST データセットの画像を分類する、簡単なニューラルネットワークを構築しましょう。このデータセットには、ファッション製品に関する 70,000 個の 28x28 グレースケール画像が含まれています。7,000 個の画像を含むカテゴリが全 10 個あります。
まず、データをダウンロードします。
1 つの画像を視覚化する
Image Summary API の動作を理解するために、トレーニングセットの最初のトレーニング画像を単純に TensorBoard ログすることにします。
これを行う前に、トレーニングデータの形状を調べてみましょう。
データセットの各画像の形状は、高さと幅を表す形状 (28, 28) の階数 2 テンソルです。
しかし、tf.summary.image()
には (batch_size, height, width, channels)
を含む階数 4 のテンソルが必要であるため、形状を変更する必要があります。
1 つの画像のみをログしているため、batch_size
は 1 となります。画像はグレースケールであるため、channels
を 1 とします。
これで画像をログし、TensorBoard で表示する準備が整いました。
では、TensorBoard を使用して画像を調べてみましょう。UI が読み込まれるまで数秒待ちます。
「Time Series」ダッシュボードに、今ログした画像が表示されます。「ankle boot(アンクルブーツ)」です。
画像は見やすいようにデフォルトのサイズに調整されています。スケーリングなしの元の画像を表示する場合は、右側の「Settings」パネル下の「Show actual image size」のチェックをオンにしてください。
明るさやコントラストのスライダを動かして、画像のピクセルにどのような影響があるかを確認します。
複数の画像を視覚化する
1 つのテンソルをログするのはうまくいきましたが、複数のトレーニングサンプルをログする場合はどうすればよいのでしょうか。
データを tf.summary.image()
に渡す際に、ログする画像数を指定するだけです。
任意の画像をログする
matplotlib が生成する画像など、テンソルでない画像を視覚化する場合はどうでしょうか。
プロットをテンソルに変換するボイラープレートコードのようなものが必要となりますが、それを通過すればこの問題はクリアです。
次のコードでは、matplotlib の subplot()
関数を使用して最初の 25 個の画像を適切なグリッドとしてログし、その後で、そのグリッドを TensorBoard で表示します。
画像分類器を構築する
綺麗な写真をプロットするためではなく、機械学習を行うためにこのチュートリアルを行っているわけですから、この作業を実際の例に適用してみましょう。
画像の要約を使用して、Fashion-MNIST データセットの簡単な分類器をトレーニングしながらモデルがどれほどうまく機能しているかを把握することにします。
まず、非常に単純なモデルを作成してコンパイルします。オプティマイザと損失関数をセットアップしましょう。コンパイルのステップでは分類器の精度も合わせてログすることを指定します。
分類器をトレーニングする際、混同行列を見ると役に立ちます。混同行列では、分類器がテストデータどどのように実行しているかを詳しく知ることができます。
混同行列を計算する関数を定義しましょう。Scikit-learn 関数を使えば簡単にこれを行え、その上で、matplotlib を使ってプロットすることができます。
これで、分類器をトレーニングしながら混同行列を定期的にログする準備が整いました。
ここでは、次の項目を行います。
基本的なメトリックをログする Keras TensorBoard コールバックを作成する
エポックが終了するたびに混同行列をログする Keras LambdaCallback を作成する
両方のコールバックが渡されるようにし、Model.fit() を使ってモデルをトレーニングする
トレーニングが進むにつれ、下にスクロールして TensorBoard の起動を確認します。
トレーニングと検証の両方のセットで、精度が上昇して言えるのがわかります。これは良い兆しではありますが、データの特定のサブセットで実行しているモデルはどうなっているでしょうか。
「Time Series」ダッシュボードを下にスクロールし、ログした混同行列を可視化してみましょう。「Settings」パネルの下にある「Show actual image size」をオンにして、混同行列をフルサイズで表示します。
デフォルトでは、このダッシュボードには最後にログされたステップまたはエポックの画像要約が表示されます。スライダーを使用して早期の混同行列を表示します。トレーニングが進むにつれ、行列が大きく変化しているのがわかります。暗めのマスが斜めに連なり、ほかの行列は 0 に近くマスの色も白くなっています。つまり、トレーニングが進むにつれ、分類器が改善しているということです。よくできました!
混同行列は、この単純なモデルにいくつかの問題があることを示しています。うまく進んではいるものの、シャツ、Tシャツ、プルオーバーが混同されているため、モデルの改善が必要です。
関心のある方は、このモデルを畳み込みネットワーク(CNN)で改善してみてください。