第2回 Kerasで実践! Cats vs. Dogs (1/6)

技術特集

1_tensorflow_keras1_tit

tit_tensorflow_keras

第2回はKerasを用いて正面からディープニューラルネットワーク(以下DNNと表記)を実装していきます。

 

記事内で必要に応じてPythonのコードを示すことがありますが、Python自体の機能や構文に関する解説は割愛させていただきますのでご了承ください。
なお、この記事にて掲載しているコードはすべてMITライセンスのもと利用を許諾するものとします。

1) 今回のお題:ディープラーニングで犬と猫を認識する

出来合いの学習済みモデルを用いた画像認識は第1回でも行いましたが、今回は自分でゴールを設定してディープラーニングを行います。
お題は「入力した画像が犬か猫かを判定する」ということにいたします。

処理の流れを整理

このプログラムに必要な機能を列挙すると、以下のようになります:

  1. 画像の学習ができる
    • 学習用の画像を読み込める
    • 読み込んだ画像でDNNの学習ができる
    • 学習済みモデルを保存できる
  2. 画像の判定ができる
    • 判定したい画像を読み込める
    • 読み込んだ画像をDNNで判定できる
    • 判定結果を表示できる

今回に限らず、ディープラーニングを行うプログラムは、「データの読み込み」「DNN処理」「結果の出力」という3つの処理を、学習向けと判定向けにそれぞれ行う、という構造をとるのが典型的です。

大枠としては以下のようなプログラムになりそうです:

import argparse
 
parser = argparse.ArgumentParser()
parser.add_argument("--infer", action="store", nargs="?", type=str,
                    help="学習は行わず、このオプションで指定した画像ファイルの判定処理を行う")
args = parser.parse_args()
 
if not args.infer:
    print("学習モード")
    # 学習データの読み込み
  
    # 学習の実行
  
    # 学習済みモデルの保存
else:
    print("判定モード")
    # 判定する画像の読み込み
  
    # 判定処理の実行
  
    # 判定結果の出力

コマンドライン引数なしで実行すると、特定のディレクトリから学習用画像を読み込んでディープラーニングを行います。コマンドライン引数として --inferオプションと共に判定したい画像のファイルパスを指定すると、学習済みモデルをもとに、その画像に写っているのが犬か猫かを判定するという想定です。

また今回は、DNNの構造の定義を上記のcat_dog_dnn_keras.pyとは別ファイルに切り出し、モジュールとして呼び出す形で進めます。