連載
» 2018年11月20日 05時00分 公開

ニューラルネットワークライブラリTensorFlow/Kerasで実践するディープラーニングPythonで始める機械学習入門(8)(2/3 ページ)

[加藤公一,シルバーエッグ・テクノロジー]

画像の分類

 ここまでは、あやめの分類の例を見てきましたが、あやめの例を出したのは簡単なネットワーク構造で結果が出せるからです。あやめの分類では、ディープラーニング以前の古典的なアルゴリズムで十分精度を上げることができます。一方で、画像の分類ではディープラーニングが実際にブレークスルーになりました。ここからは、画像の分類の例を見てみます。

画像分類のデータセット「cifar10」の準備

 「cifar10」という有名な画像分類のデータセットを使います。

 cifar10のデータをダウンロードし、訓練用データを「(train_data, train_label)」に、テスト用データを「(test_data, test_label)」に格納しています。train_dataとtest_dataは特徴量のデータであり、つまり画像データです。基のデータは画素のRGB値を0〜255で表していますが、それを0〜1の範囲になるようにスケーリングしています。

 また、ラベルデータは2次元配列で与えられますが、後の処理のためにravelで1次元配列に変換しています。train_data.shapeを表示して確認したように、train_dataは4次元配列です。4次元のうち最初の次元は何枚目の画像かを示しています。

 次の2つの次元はピクセルの座標に対応し、最後の次元はRGBのどれを指すかを示しています。つまりi番目(0から数える)の画像の座標(j,k)のピクセルのR(赤)の値はインデックス[i,j,k,0]の値に対応しています。

 ラベルの値は0〜9の整数値になっていますが、それぞれの番号に対応する物体は次のようになっています。

 ディープラーニングを適用する前にデータの中身を見てみます。各ラベルに対応する画像を10個ずつ訓練データから取り出して表示すると次のようになります。

「コンボリューション(畳み込み)」層と「マックスプール」層

 では、これを学習させるためのネットワークを定義します。

 あやめの例ではDenseというクラスを使って上位層と下位層を密につないでいましたが、cifar10のデータでは、各画像が32×32×3個の数値を持つので、その入力層と中間層を密につなぐと計算コストが高くなり過ぎます。そこで、「コンボリューション(畳み込み)」層と「マックスプール」層を組み合わせています。これは画像認識ではよく使われるテクニックです。

 コンボリューション層は、決められたサイズの長方形(多くの場合は正方形)の中の点についての重み付け和を計算したものを、ノードに割り当てる仕組みです。その重み付けのことを「フィルター」と呼びます。フィルターを1つずつずらしながら画像の左上から順番に画像の全体をカバーするように重み付け和を計算します。通常は複数のフィルターを用意し、それぞれに重み付け和を計算します。上記サンプルコードでは「Conv2D」の第1引数の「16」というのがフィルター数で、第2引数の「(3,3)」がフィルターのサイズです。

コンボリューション層

 マックスプール層は、入力を同じ大きさのマスに区切って、各マスの中にある点の最大値を取ったものをノードに割り当てる仕組みです。サンプルコード中の「MaxPool2D」の引数として指定している「(2,2)」はマスの大きさを意味します。

マックスプール層

 ここではコンボリューション(Conv2D)とマックスプール(MaxPool2D)を作用させる操作を2回行っています。その次に「Flatten」という層がありますが、ここでは2次元配列だったものを1次元に変換します。Flattenの層では数値的な計算をするわけではありません。最後の2つの層は密につなげていて、出力層はsoftmax関数を使ってワンホットエンコーディングをしています。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。