Keras

Kerasに関して

関数の意味

model.add(Conv2D(32, (3, 3), input_shape=(128, 128, 3)))

・32個のフィルタ(カーネル)を用意。
・フィルタサイズは(3,3)
・入力画像は128*128pxとRGB分で*3

出力画像は(126, 126, 32)

出力表の見方

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 126, 126, 32)      896       
_________________________________________________________________

input_shape=(データ数, 128, 128, 3)の4次元テンソル。
・出力画像は周囲1px分減って126*126px(sameを使うと縁は0で埋めてくれる)。
・Paramは層のパラメータ数。今回はRGBなのでフィルタも3次元、すなわち一つのフィルタの重みの数は、3*3*3=27にバイアスを足して27+1=28。あとはフィルタ数をかけて28*32=896。出力は式で表すと

y=\phi \left(\sum_{j=1}^{27} w_{ij}x_j+b_i \right)

iはフィルタ番号、jはフィルタの重み。

fit_generatorの使い方

history = model.fit_generator(
    generator=train_generator,
    steps_per_epoch=200,
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=200)

ミニバッチでの重み更新を行ってくれる。

引用:https://jp.mathworks.com/matlabcentral/answers/333915-

誤差計算と重み更新には、主にバッチ、ミニバッチ、オンラインの三つのいずれかの方法が使われます。
このうちのミニバッチ学習とは、ネットワークのパラメータ学習に対して全学習サンプルを一度に使うのではなく、全学習サンプルから一定数のサンプルを抽出したサブセットを使って誤差計算と重み更新を行う方法です。ひとつのサンプルごとに重みを更新するオンラインの方法と比較すると高速に処理を行うことができ、バッチと比べて良い精度を得られることが、ミニバッチの利点です。ディープラーニングでミニバッチを使用する際には、よくエポックごとにミニバッチの学習サンプルがシャッフルされ、ランダムに抽出されます。

・generatorとvalidation_data、(inputs, targets)のタプル。
・steps_per_epochとvalidation_stepsは、1エポックあたりのステップ数。すなわち、全サンプル数=バッチ数*ステップ数。

参考

http://qiita.com/agumon/items/ab2de98a3783e0a93e66
https://deepage.net/deep_learning/2016/11/07/convolutional_neural_network.html
http://qiita.com/icoxfog417/items/96ecaff323434c8d677b