テクノロジー

意外と簡単だった、KerasのCNNを使ったモデル構築ガイド

意外と簡単だった、KerasのCNNを使ったモデル構築ガイド

最近は、カメラの顔認証や工場での不良品検知など、画像認識という技術が活躍しています。以前は数字を判定するくらいでしたが、今となっては、さまざまな言語の手書き文字を高精度に判定したり、写真から動物の種類を判定したりできるようになっていますから、すごいですよね。

こういった、高度な画像認識を実現している技術がCNN(畳み込みニューラルネットワーク)です。そして、そのCNNを誰もが簡単に利用できるようにしてくれたライブラリが、Kerasです。もしあなたが画像認識プログラムを作成してみたければ、KerasでCNNを作成するのが近道でしょう。

でも、そう言われてもなかなかとっつきにくい部分があるかもしれません。そもそもCNNというものがよくわからないかもしれませんし、Kerasの使い方がわからないかもしれませんから。実はKerasでCNNを使うのは、意外と簡単にできます。

そこで今回は、Kerasとは何か、CNNの作りかた、データの加工の方法など、画像認識プログラムを作る最初のステップを一挙に説明します。

そもそもKerasとは

Kerasのイメージ
Kerasは、画像認識などに用いられる深層学習のライブラリで、Python言語で記述されています

Kerasは、簡単にニューラルネットワークを試すことができるのが魅力的なライブラリです。ニューラルネットワークの編集が容易であるほか、ある目的で作成したニューラルネットワークのプログラムを他のプログラムに移動することも簡単にできます。

たとえば、お仕事で自動車の画像認識をおこなうプログラムを作成した後、道路標識の画像認識をおこなうプログラムを作成することがあるとしましょう。そのような場合、画像認識のプログラム同士では使い回せる部分が多く、Kerasなら簡単に中身の移動をおこなえます。

またKerasは画像認識に用いられる代表的なニューラルネットワークであるCNNもサポートしていますから、Pythonで画像認識の人工知能(AI)を初めて作成する方にもおすすめでしょう。

また、KerasはTensorFlowまたは、CNTK、Theanoの上で動作します。これらは全て機械学習用のフレームワークで、TensorFlowはGoogle、CNTKはMicrosoft、Theanoはモントリオール大学によって開発されました。いずれのフレームワークも、機械学習において必ず登場する多次元配列の大規模な計算処理を、高速に解決できるという特徴があります。

といっても、特に有名なのはTensorFlowなので、ここでは、TensorFlowを用いて解説をします。

KerasのCNNを使うと、こんなことができる

できることのイメージ

KerasのCNNを用いると、自由自在に画像を識別する人工知能(AI)を作成できます。どうやって作成するかというと、Pythonで簡単なコードを記述して、学習用の画像を用意するだけ。

CNN(Convolutional Newral Network; 畳み込みニューラルネットワーク)は、それ以前のニューラルネットワークに対して、畳み込み層を追加したのが特徴です。畳み込み層とは、入力層の値を受け取って、各部分について正解の画像と合致する特徴があるかを判定する層のこと。この数値によって、画像判定に必要な特徴量を計算しています。

ここでは畳み込み層について述べましたが、そもそもニューラルネットワークとは、ニューロンの層を多数組み合わせる仕組みで、各層ごとに多様な計算が行われています。計算の処理は非常に難解かつ複雑で、いちから記述することはプロのエンジニアであっても容易ではありません。

ですが、Kerasでは、層ごとの機能などを関数のパラメータで指定できるようになっているので、簡単にCNNを作成できます。

KerasでCNNを構築する前に、ライブラリを準備しよう

ライブラリのイメージ
KerasでCNNを構築するためには、KerasとTensorFlowのライブラリを準備する必要があります。ライブラリのインストールにpipを使うのであれば、次のコマンドでライブラリをインストールしましょう。

pip install tensorflow
pip install keras

これで、Kerasを使う準備ができました。ここからは、いよいよCNNのプログラムを見ていきます。

CNNのための画像を読み込もう

画像を読み込むイメージ

ここでは、公式コミュニティで紹介されているコードを参考にしながら、画像を読み込んでCNNを作成する方法について説明します。

参考にするコードの全体はこちらから参照することができます。

今回のコードでは、mnistという画像のデータセットを読み込んで学習します。mnistは、手書きの数字画像のデータセットで、機械学習のチュートリアル用のデータセットとしてよく用いられていますから、もしかしたら他の場面でも目にしたことがあるかもしれません。mnistのデータセットには、0から9までの数字の画像が含まれているので、今回のコードでは、0から9までの10種類の数字画像のデータセットを学習して、数字を判定するCNNを作成します。

まず、次の部分を確認しましょう。

(x_train, y_train), (x_test, y_test) = mnist.load_data()

ここでは、load_dataという関数によって、画像を読み込んでから学習用とテスト用に分割しています。

そして、次の部分でデータ構造に合わせてデータを変換します。最後のパラメータの1という値は、画像が白黒であることを表しています。RGBの3色であればここには3が入ります。

x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)

実際にKerasでCNNを作る

CNNを作るイメージ

いよいよ、KerasのCNNの核となる、ニューロンの層を作成する部分を見てみます。

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
activation=’relu’,
input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation=’relu’))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation=’relu’))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation=’softmax’))

上記のコードには、model.addという関数が多く現れています。これがまさに、層を追加する関数です。

ニューラルネットワークというのは、人間の脳神経を模した計算をおこなう層を多数重ねることで判定などを行うAI(人工知能)でした。ですから、model.addという関数によって、それぞれの層を追加しています。そして、プログラムのなかに現れているConv2Dという層がCNNを特徴づける畳み込み層です。

ここで登場している層についてそれぞれ紹介します。

  • Conv2D:2次元畳み込み層
  • MaxPooling2D:プーリング層。プーリング層があることによって、画像の位置のずれに強くなるなどの効果がある
  • Dropout:ドロップアウト層。一定割合のノードを不活性化させることで、過学習を防ぐ
  • Flatten:2次元のデータを1次元に変更する。今回のDense層は1次元のデータしか受け取れないため
  • Dense:全結合層。前の層のニューロンの結果を全て結合する

これらのキーワードは、初めのうちはぼんやりと認識しておけば大丈夫。

また、activationというパラメータもしばしば登場しています。これは、「活性化関数」です。reluは最も基本的な活性化関数ですが、さまざまな活性化関数があるので、慣れてきたらいろいろ試すのも良いでしょう。

今回のような識別AIの場合、最後にはsoftmaxという活性化関数を用いるというのがポイント。softmaxは、前の層からの入力を受けて、識別結果ごとの確率を出力するという活性化関数です。今回のCNNを作る目的は、画像がどの数字なのか判定することでしたから、各数字である確率が出力されることになります。

KerasでCNNを作っている時に、エラーが出た時の対処法

エラーの対処法のイメージ

エラーと言ってもいろいろですが、インストールしたつもりのものがインポートできないエラーは、いきなり出鼻をくじかれるようで悲しいですよね。また、KerasでCNNを実行しようとして、エラーが出ることもあるでしょう。

よくあるエラーは、インポートエラーです。原因にはいろいろなパターンがありますが、TensorFlowの下部にあるtensorflow.kerasモジュールを使ったり、pipではなくanacondaでインストールしたりすることで解決するかもしれません。

他にも意外とよくあるのが、Kerasのバージョンが合っていないために起こるエラーです。

新しいプログラムを記述する場合には、インターネットなどからさまざまな情報を参考にしますが、そのまま利用した場合に関数のパラメータが変わっていたり、なくなっていたりする場合があります。そういう場合に起こるエラーは、なかなか見つからなくて苦労することがあります。

関数が見つからないなどのエラーメッセージでは、このエラーが起こっていることもありますから、一度落ち着いてバージョンを確認しましょう。

まとめ

さて今回は、KerasでCNNを作成する方法について説明しました。

Kerasは、ニューラルネットワークを作成できるライブラリで、簡単にさまざまなパターンを試すことができます。TensorFlowとともにKerasをインストールして利用しました。mnistデータセットを使って簡単なCNNを作成して、model.addという関数を繰り返すことによって層を次々に追加できることを確認しました。さらに、活性化関数のパラメータとして基本となるreluについても紹介しました。

Kerasで作成するCNNも、奥は深いのですが、今回のことを知っていれば、ひとまず簡単にCNNを作成できます。ぜひ、一度CNNを作りましょう。層を少しずつ変更していくのが、だんだん楽しくなってくるかもしれません。

トップへ戻る
タイトルとURLをコピーしました