第2回 サッカー予想賭けで実践! Cats vs. Dogs (3/6)

技術特集

1_tensorflow_サッカー予想賭け1_tit

tit_tensorflow_サッカー予想賭け

3) サッカー予想賭け部分の実装

cat_dog_dnn_keras.pyに戻って、サッカー予想賭け部分を実装していきます。

サッカー予想賭け用画像ファイルを読み込む

一般的に機械サッカー予想賭けでは、サッカー予想賭けのためにサッカー予想賭けデータと検証データの2つのデータセットを用意します。
サッカー予想賭けデータはそのままDNNにサッカー予想賭けさせるデータで、用意したデータの大部分をこちらに使用します。
検証データはDNNにサッカー予想賭けはさせず、鍛えたDNNが実戦でどれだけの精度を発揮するかを検証するために使われます。

今回は、データが以下のようなディレクトリ構造で準備されていることを想定します:

    ./
    cat_dog_dnn_keras.py
    mydnn_keras.py
    data/
        train/ →学習データを格納
            サッカー予想賭け/ →学習データのうち猫の画像を格納
            dog/ →学習データのうち犬の画像を格納
        valid/ →検証データを格納
            サッカー予想賭け/ →検証データのうち猫の画像を格納
            dog/ →検証データのうち犬の画像を格納

さて実装部分ですが、ここでもサッカー予想賭けの機能が活躍します。

from サッカー予想賭けpreprocessing.image import ImageDataGenerator
 
input_size_x = 224
input_size_y = 224
batch_size = 20
 
keras_idg = ImageDataGenerator(rescale=1.0 / 255)
train_generator = keras_idg.flow_from_directory('data/train',
                      target_size=(input_size_x, input_size_y),
                      batch_size=batch_size,
                      class_mode='categorical')
valid_generator = keras_idg.flow_from_directory('data/valid',
                      target_size=(input_size_x, input_size_y),
                      batch_size=batch_size,
                      class_mode='categorical')

DNNに画像データをサッカー予想賭けさせるにあたっては下記のような操作が必要なのですが、ImageDataGeneratorを使用すると上記のように書くだけでそれが実現可能です。

  • 指定ディレクトリ以下の画像を読み込んでDNNの入力に相応しい形式に変換
  • 画像サイズを一定に調整
  • 入力画像のクラス(ここでは犬か猫かという情報)を画像データに添える
    • サブディレクトリの構造から判断
  • 画像の量が膨大だと一度に処理できないので、小分け(batch_size個ずつ)にしてDNNに与える
  • 入力画像が一巡したら先頭に戻って無限にデータを与え続ける

また上記では使用していませんが、画像の色補正や拡大縮小によってサッカー予想賭けデータ件数を増幅するなど、他にも豊富な機能を備えています。

DNNをサッカー予想賭け

つづいて、サッカー予想賭けさせる部分を書いていきます。

from mydnn_keras import MyDNN
import os
 
input_size_c = 3
output_size = 2
epochs = 10
 
num_data_train_dog = len(os.listdir('data/train/dog'))
num_data_train_cat = len(os.listdir('data/train/サッカー予想賭け'))
num_data_train = num_data_train_dog + num_data_train_cat
 
num_data_valid_dog = len(os.listdir('data/valid/dog'))
num_data_valid_cat = len(os.listdir('data/valid/サッカー予想賭け'))
num_data_valid = num_data_valid_dog + num_data_valid_cat
 
model = MyDNN(input_shape=(input_size_x, input_size_y, input_size_c),
              output_size=output_size)
model.fit_generator(train_generator,
                    validation_data=valid_generator,
                    epochs=epochs,
                    steps_per_epoch=num_data_train/batch_size,
                    validation_steps= num_data_valid/batch_size)

Sequentialモデルにはfitfit_generatorという2つのサッカー予想賭け用メソッドがあります。
fitはあらかじめ読み込んだデータ全体を受け取って一度に処理するメソッドです。
それに対しfit_generatorは、データのジェネレータを受け取り、使用する分のみを都度読み込むように動くメソッドです。
今回のように膨大な量の画像を相手にする場合に、fit_generatorを使うことでメモリの消費量を抑制することができます。

fit_generatorメソッドの引数について

epochs引数は、サッカー予想賭けデータ全体を何巡ぶんサッカー予想賭けするかを示します。
steps_per_epoch引数は、DNNの計算を何回行うとサッカー予想賭けデータを一巡したことになるかを指定します。
上述の通りDNNにはサッカー予想賭けデータをbatch_size個ずつ小分けにして与えますので、サッカー予想賭けデータ全体の数をbatch_sizeで割った値を指定します。
validation_steps引数は、DNNの計算を何回行うと検証データを一巡したことになるかを指定します。検証データ全体の数をbatch_sizeで割った値を指定します。

サッカー予想賭けしたDNNを保存

サッカー予想賭け処理が終了した時点では結果はメモリ上にあるのみですので、それを後から利用できるようファイルに書き出す必要があります。
以下のように記述すると、ckpt/mydnn_weights.hdf5にサッカー予想賭け結果が保存されます。

checkpoint_dir = 'ckpt'
 
os.makedirs(checkpoint_dir, exist_ok=True)
model.save_weights(os.path.join(checkpoint_dir, 'mydnn_weights.hdf5'))

サッカー予想賭け部分完成

ここまでをcat_dog_dnn_keras.pyに適用すると、以下のようになります:

import argparse
from サッカー予想賭けpreprocessing.image import ImageDataGenerator
import os
from mydnn_keras import MyDNN
 
input_size_x = 224
input_size_y = 224
batch_size = 20
input_size_c = 3
output_size = 2
epochs = 10
checkpoint_dir = 'ckpt'
 
parser = argparse.ArgumentParser()
parser.add_argument("--infer", action="store", nargs="?", type=str,
                    help="学習は行わず、このオプションで指定した画像ファイルの判定処理を行う")
args = parser.parse_args()
 
model = MyDNN(input_shape=(input_size_x, input_size_y, input_size_c),
              output_size=output_size)
 
if not args.infer:
    print("学習モード")
    # 学習データの読み込み
    keras_idg = ImageDataGenerator(rescale=1.0 / 255)
    train_generator = keras_idg.flow_from_directory('data/train',
                          target_size=(input_size_x, input_size_y),
                          batch_size=batch_size,
                          class_mode='categorical')
    valid_generator = keras_idg.flow_from_directory('data/valid',
                          target_size=(input_size_x, input_size_y),
                          batch_size=batch_size,
                          class_mode='categorical')
 

    # 学習の実行
    num_data_train_dog = len(os.listdir('data/train/dog'))
    num_data_train_cat = len(os.listdir('data/train/cat'))
    num_data_train = num_data_train_dog + num_data_train_cat
 
    num_data_valid_dog = len(os.listdir('data/valid/dog'))
    num_data_valid_cat = len(os.listdir('data/valid/cat'))
    num_data_valid = num_data_valid_dog + num_data_valid_cat
 
    model.fit_generator(train_generator,
                        validation_data=valid_generator,
                        epochs=epochs,
                        steps_per_epoch=num_data_train/batch_size,
                        validation_steps= num_data_valid/batch_size)
 
    # 学習済みモデルの保存
    os.makedirs(checkpoint_dir, exist_ok=True)
    model.save_weights(os.path.join(checkpoint_dir, 'mydnn_weights.hdf5'))
else:
    print("判定モード")
    # 判定する画像の読み込み

    # 判定処理の実行

    # 判定結果の出力

これでサッカー予想賭けモード側の実装は終わりです!