2017/08/09
16:34

TensorFlowで畳み込みニューラルネットワーク(CNN)実装③ [誤差関数と学習部分の記述]


みなさんこんにちは。
人工知能ラボの助手です。

今回も、CNN実装の続きをやっていきたいと思います。

今までの記事:
TensorFlowで畳み込みニューラルネットワーク(CNN)実装①
[重み・バイアス生成と畳み込み・プーリング処理関数の定義]

TensorFlowで畳み込みニューラルネットワーク(CNN)実装②
[ネットワークの記述]


前回までの記事では、CNNの計算処理(ネットワーク)
を記述するところまでを実装してきました。

今回は、誤差関数とその学習方法の定義を行います。

いつもどおり、まずはコードを載せて、後から簡単に説明を
加えていきたいと思います。

コード
# 誤差関数
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))

# 学習
train_step = tf.train.AdamOptimizer(0.0001).minimize(loss)

# 正解率の計算
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

まず、誤差関数です。
今回はクラス分類を行うので、クロスエントロピー
を使用します。
この誤差は、記事冒頭画像の数式を見ていただくと
分かるかと思いますが、出力のベクトルにおける、
正解ラベルの値が1のときに最小値(0)を取り、値が0に
近付いて行くほど大きくなっていきます。
また、正解以外のラベルの誤差に関しては考慮していません。

このことからも、クラス分類に適した誤差であることが
直感的に分かりますね。

(必ずしもそうとは限りませんが、誤差関数には
回帰では2乗誤差、クラス分類ではクロスエントロピー
を使用することが多いです)

続いて学習です。
オプティマイザーは通常の勾配効果の改良であるAdam法、
学習率は0.0001としました。

また、今回は最後に正解率の計算を行っています。
1行目で、y(ネットワークの出力)とy_(教師ラベル)
が一致しているかを確認し、
2行目でその一致率を計算しています。

ただし、yはそれぞれのクラスの確率となっているので
正確には、yのうち確率が最大のクラスと、教師ラベルの
インデックスが等しいかを確認しています。

ここまでくれば、あとは今までもこのブログで扱ってきた
のものと同様に、
セッションを作成して指定回数の学習を行うだけに
なります。

その部分のプログラムは、次次回の実際に学習を
させてみる回で書こうかと思っていますが、
確認したい方は以下の記事をご覧ください。

TensorFlowによる回帰分析③

TensorFlowで回帰分析を実装した時の学習部分についての
説明が載っています。

それでは、今回はここまでにしておきましょう。

次回は、入力する画像データの基本的な前処理
(リサイズなど)について書きたいと思います。


お疲れ様でした!