Path: blob/master/site/ja/r1/tutorials/keras/basic_classification.ipynb
25118 views
Copyright 2018 The TensorFlow Authors.
はじめてのニューラルネットワーク:分類問題の初歩
Note: これらのドキュメントは私たちTensorFlowコミュニティが翻訳したものです。コミュニティによる 翻訳はベストエフォートであるため、この翻訳が正確であることや英語の公式ドキュメントの 最新の状態を反映したものであることを保証することはできません。 この翻訳の品質を向上させるためのご意見をお持ちの方は、GitHubリポジトリtensorflow/docsにプルリクエストをお送りください。 コミュニティによる翻訳やレビューに参加していただける方は、 [email protected] メーリングリストにご連絡ください。
このガイドでは、スニーカーやシャツなど、身に着けるものの写真を分類するニューラルネットワークのモデルを訓練します。すべての詳細を理解できなくても問題ありません。TensorFlowの全体を早足で掴むためのもので、詳細についてはあとから見ていくことになります。
このガイドでは、TensorFlowのモデルを構築し訓練するためのハイレベルのAPIである tf.kerasを使用します。
ファッションMNISTデータセットのロード
このガイドでは、Fashion MNISTを使用します。Fashion MNISTには10カテゴリーの白黒画像70,000枚が含まれています。それぞれは下図のような1枚に付き1種類の衣料品が写っている低解像度(28×28ピクセル)の画像です。
![]() |
Figure 1. Fashion-MNIST samples (by Zalando, MIT License). |
Fashion MNISTは、画像処理のための機械学習での"Hello, World"としてしばしば登場するMNIST データセットの代替として開発されたものです。MNISTデータセットは手書きの数字(0, 1, 2 など)から構成されており、そのフォーマットはこれから使うFashion MNISTと全く同じです。
Fashion MNISTを使うのは、目先を変える意味もありますが、普通のMNISTよりも少しだけ手応えがあるからでもあります。どちらのデータセットも比較的小さく、アルゴリズムが期待したとおりに機能するかどうかを確かめるために使われます。プログラムのテストやデバッグのためには、よい出発点になります。
ここでは、60,000枚の画像を訓練に、10,000枚の画像を、ネットワークが学習した画像分類の正確性を評価するのに使います。TensorFlowを使うと、下記のようにFashion MNISTのデータを簡単にインポートし、ロードすることが出来ます。
ロードしたデータセットは、NumPy配列になります。
train_images
とtrain_labels
の2つの配列は、モデルの訓練に使用される訓練用データセットです。訓練されたモデルは、
test_images
とtest_labels
配列からなるテスト用データセットを使ってテストします。
画像は28×28のNumPy配列から構成されています。それぞれのピクセルの値は0から255の間の整数です。ラベル(label)は、0から9までの整数の配列です。それぞれの数字が下表のように、衣料品のクラス(class)に対応しています。
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枚の画像を、クラス名付きで表示してみましょう。ネットワークを構築・訓練する前に、データが正しいフォーマットになっていることを確認します。
モデルの構築
ニューラルネットワークを構築するには、まずモデルの階層を定義し、その後モデルをコンパイルします。
層の設定
ニューラルネットワークを形作る基本的な構成要素は層(layer)です。層は、入力されたデータから「表現」を抽出します。それらの「表現」は、今取り組もうとしている問題に対して、より「意味のある」ものであることが期待されます。
ディープラーニングモデルのほとんどは、単純な層の積み重ねで構成されています。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ノードのsoftmax層です。この層は、合計が1になる10個の確率の配列を返します。それぞれのノードは、今見ている画像が10個のクラスのひとつひとつに属する確率を出力します。
モデルのコンパイル
モデルが訓練できるようになるには、いくつかの設定を追加する必要があります。それらの設定は、モデルのコンパイル(compile)時に追加されます。
損失関数(loss function) —訓練中にモデルがどれくらい正確かを測定します。この関数の値を最小化することにより、訓練中のモデルを正しい方向に向かわせようというわけです。
オプティマイザ(optimizer)—モデルが見ているデータと、損失関数の値から、どのようにモデルを更新するかを決定します。
メトリクス(metrics) —訓練とテストのステップを監視するのに使用します。下記の例ではaccuracy (正解率)、つまり、画像が正しく分類された比率を使用しています。
モデルの訓練
ニューラルネットワークの訓練には次のようなステップが必要です。
モデルに訓練用データを投入します—この例では
train_images
とtrain_labels
の2つの配列です。モデルは、画像とラベルの対応関係を学習します。
モデルにテスト用データセットの予測(分類)を行わせます—この例では
test_images
配列です。その後、予測結果とtest_labels
配列を照合します。
訓練を開始するには、model.fit
メソッドを呼び出します。モデルを訓練用データに "fit"(適合)させるという意味です。
モデルの訓練の進行とともに、損失値と正解率が表示されます。このモデルの場合、訓練用データでは0.88(すなわち88%)の正解率に達します。
正解率の評価
次に、テスト用データセットに対するモデルの性能を比較します。
ご覧の通り、テスト用データセットでの正解率は、訓練用データセットでの正解率よりも少し低くなります。この訓練時の正解率とテスト時の正解率の差は、過学習(over fitting)の一例です。過学習とは、新しいデータに対する機械学習モデルの性能が、訓練時と比較して低下する現象です。
予測する
モデルの訓練が終わったら、そのモデルを使って画像の分類予測を行うことが出来ます。
これは、モデルがテスト用データセットの画像のひとつひとつを分類予測した結果です。最初の予測を見てみましょう。
予測結果は、10個の数字の配列です。これは、その画像が10の衣料品の種類のそれぞれに該当するかの「確信度」を表しています。どのラベルが一番確信度が高いかを見てみましょう。
というわけで、このモデルは、この画像が、アンクルブーツ、class_names[9]
である可能性が最も高いと判断したことになります。これが正しいかどうか、テスト用ラベルを見てみましょう。
10チャンネルすべてをグラフ化してみることができます。
0番目の画像と、予測、予測配列を見てみましょう。
予測の中のいくつかの画像を、予測値とともに表示してみましょう。正しい予測は青で、誤っている予測は赤でラベルを表示します。数字は予測したラベルのパーセント(100分率)を示します。自信があるように見えても間違っていることがあることに注意してください。
最後に、訓練済みモデルを使って1枚の画像に対する予測を行います。
tf.keras
モデルは、サンプルの中のバッチ(batch)あるいは「集まり」について予測を行うように作られています。そのため、1枚の画像を使う場合でも、リスト化する必要があります。
そして、予測を行います。
model.predict
メソッドの戻り値は、リストのリストです。リストの要素のそれぞれが、バッチの中の画像に対応します。バッチの中から、(といってもバッチの中身は1つだけですが)予測を取り出します。
というわけで、モデルは9というラベルを予測しました。