Path: blob/master/site/ja/tutorials/keras/classification.ipynb
25118 views
Copyright 2018 The TensorFlow Authors.
はじめてのニューラルネットワーク:分類問題の初歩
このガイドでは、スニーカーやシャツなど、身に着けるものの画像を分類するニューラルネットワークのモデルをトレーニングします。すべての詳細を理解できなくても問題ありません。ここでは、完全な TensorFlow プログラムについて概説し、細かいところはその過程において見ていきます。
このガイドでは、TensorFlowのモデルを構築し訓練するためのハイレベルのAPIである tf.kerasを使用します。
Fashion MNIST データセットをインポートする
このガイドでは、Fashion MNIST データセットを使用します。このデータセットには、10 カテゴリの 70,000 のグレースケール画像が含まれています。次のように、画像は低解像度(28 x 28 ピクセル)で個々の衣料品を示しています。
![]() |
図 1. Fashion-MNIST サンプル (作成者:Zalando、MIT ライセンス) |
Fashion MNISTは、画像処理のための機械学習での"Hello, World"としてしばしば登場するMNIST データセットの代替として開発されたものです。MNISTデータセットは手書きの数字(0, 1, 2 など)から構成されており、そのフォーマットはこれから使うFashion MNISTと全く同じです。
Fashion MNIST を使うのは、目先を変える意味もありますが、普通の MNIST よりも少しだけ手応えがあるからでもあります。どちらのデータセットも比較的小さく、アルゴリズムが期待したとおりに機能するかどうかを確認するために使われます。プログラムのテストやデバッグのためには、よい出発点になります。
ここでは、60,000 枚の画像を使用してネットワークをトレーニングし、10,000 枚の画像を使用して、ネットワークが画像の分類をどの程度正確に学習したかを評価します。Tensor Flow から直接 Fashion MNIST にアクセスできます。Tensor Flow から直接 Fashion MNIST データをインポートして読み込みます。
読み込んだデータセットは、NumPy 配列になります。
train_images
とtrain_labels
の 2 つの配列は、モデルのトレーニングに使用されるトレーニング用データセットです。モデルは、テストセット、
test_images
およびtest_labels
配列に対してテストされます。
画像は 28×28 の NumPy 配列から構成されています。それぞれのピクセルの値は 0 から 255 の間です。ラベルは、0 から 9 までの整数の配列です。それぞれの数字が下表のように、衣料品のクラスに対応しています。
Label | Class |
---|---|
0 | T-shirt/top |
1 | Trouser |
2 | Pullover |
3 | Dress |
4 | Coat |
5 | Sandal |
6 | Shirt |
7 | Sneaker |
8 | Bag |
9 | Ankle boot |
画像はそれぞれ単一のラベルに分類されます。データセットには上記のクラス名が含まれていないため、後ほど画像を出力するときのために、クラス名を保存しておきます。
データの観察
モデルのトレーニングを行う前に、データセットの形式を見てみましょう。下記のように、トレーニング用データセットには 28 × 28 ピクセルの画像が 60,000 含まれています。
同様に、トレーニング用データセットには 60,000 のラベルが含まれています。
ラベルはそれぞれ、0 から 9 までの間の整数です。
テスト用データセットには、10,000 の画像が含まれます。画像は 28 × 28 ピクセルで構成されています。
テスト用データセットには 10,000 のラベルが含まれます。
データの前処理
ネットワークをトレーニングする前に、データを前処理する必要があります。最初の画像を調べてみればわかるように、ピクセルの値は 0 から 255 の間の数値です。
これらの値をニューラルネットワークモデルに供給する前に、0 から 1 の範囲にスケーリングします。これを行うには、値を 255 で割ります。トレーニングセットとテストセットを同じ方法で前処理することが重要です。
訓練用データセットの最初の25枚の画像を、クラス名付きで表示してみましょう。ネットワークを構築・訓練する前に、データが正しいフォーマットになっていることを確認します。
モデルの構築
ニューラルネットワークを構築するには、まずモデルのレイヤーを定義し、その後モデルをコンパイルします。
レイヤーの設定
ニューラルネットワークの基本的な構成要素は、レイヤーです。レイヤーは、レイヤーに入力されたデータから表現を抽出します。 これらの表現は解決しようとする問題に有用であることが望まれます。
ディープラーニングモデルのほとんどは、単純なレイヤーの積み重ねで構成されています。tf.keras.layers.Dense
のようなレイヤーのほとんどには、トレーニング中に学習されるパラメータが存在します。
このネットワークの最初のレイヤーは、tf.keras.layers.Flatten
です。このレイヤーは、画像を(28 × 28 ピクセルの)2 次元配列から、28×28=784 ピクセルの、1 次元配列に変換します。このレイヤーが、画像の中に積まれているピクセルの行を取り崩し、横に並べると考えてください。このレイヤーには学習すべきパラメータはなく、ただデータのフォーマット変換を行うだけです。
ピクセルが1次元化されたあと、ネットワークは 2 つの tf.keras.layers.Dense
レイヤーとなります。これらのレイヤーは、密結合あるいは全結合されたニューロンのレイヤーとなります。最初の Dense
レイヤーには、128 個のノード(あるはニューロン)があります。最後のレイヤーでもある 2 番めのレイヤーは、長さが 10 のロジット配列を返します。それぞれのノードは、今見ている画像が 10 個のクラスのひとつひとつに属する確率を出力します。
モデルのコンパイル
モデルのトレーニングの準備が整う前に、さらにいくつかの設定が必要です。これらは、モデルのコンパイルステップ中に追加されます。
モデルの訓練
ニューラルネットワークモデルのトレーニングには、次の手順が必要です。
モデルトレーニング用データを投入します。この例では、トレーニングデータは
train_images
およびtrain_labels
配列にあります。モデルは、画像とラベルの対応関係を学習します。
モデルにテスト用データセットの予測(分類)を行わせます。この例では
test_images
配列です。その後、予測結果とtest_labels
配列を照合します。予測が
test_labels
配列のラベルと一致することを確認します。
モデルに投入する
トレーニングを開始するには、model.fit
メソッドを呼び出します。
モデルのトレーニングの進行とともに、損失値と正解率が表示されます。このモデルの場合、トレーニング用データでは 0.91 (すなわち 91%) の正解率に達します。
正解率を評価する
次に、モデルがテストデータセットでどのように機能するかを比較します。
ご覧の通り、テスト用データセットでの正解率は、トレーニング用データセットでの正解率よりも少し低くなります。このトレーニング時の正解率とテスト時の正解率の差は、過適合の一例です。過適合とは、新しいデータに対する機械学習モデルの性能が、トレーニング時と比較して低下する現象です。過適合モデルは、トレーニングデータセットのノイズと詳細を「記憶」するため、新しいデータでのモデルのパフォーマンスに悪影響を及ぼします。詳細については、以下を参照してください。
予測する
トレーニングされたモデルを使用して、いくつかの画像に関する予測を行うことができます。ソフトマックスレイヤーをアタッチして、モデルの線形出力であるロジットを解釈しやすい確率に変換します。
これは、モデルがテスト用データセットの画像のひとつひとつを分類予測した結果です。最初の予測を見てみましょう。
予測結果は、10個の数字の配列です。これは、その画像が10の衣料品の種類のそれぞれに該当するかの「確信度」を表しています。どのラベルが一番確信度が高いかを見てみましょう。
このモデルは、この画像が、アンクルブーツ、class_names[9]
である可能性が最も高いと判断したことになります。これが正しいかどうか、テスト用ラベルを見てみましょう。
これをグラフ化して、10 クラスの予測の完全なセットを確認します。
予測を検証する
トレーニングされたモデルを使用して、いくつかの画像に関する予測を行うことができます。
0 番目の画像、予測、および予測配列を見てみましょう。 正しい予測ラベルは青で、間違った予測ラベルは赤です。 数値は、予測されたラベルのパーセンテージ (/100) を示します。
いくつかの画像をそれらの予測とともにプロットしてみましょう。確信度が高い場合でも、モデルが間違っていることがあることに注意してください。
トレーニングされたモデルを使用する
最後に、トレーニング済みモデルを使って 1 つの画像に対する予測を行います。
tf.keras
モデルは、サンプルの中のバッチあるいは「集まり」についてまとめて予測を行うように最適化されています。そのため、1 つの画像を使う場合でも、リスト化する必要があります。
そして、予測を行います。
tf.keras.Model.predict
は、リストのリストを返します。リストの要素のそれぞれが、バッチの中の画像に対応します。バッチの中から、(といってもバッチの中身は1つだけですが) 予測を取り出します。
モデルは期待どおりにラベルを予測しました。