2017/07/28
0:00

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



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

今回からは、画像認識への応用で有名な、
畳み込みニューラルネットワーク(以下、CNNと記述)
を、TensorFlowで実装していきたいと思います。


以下のような構成で4~5回くらいに分けて
書いていこうかと考えています。
(順番は前後する可能性があります)

①重みフィルター生成、バイアス生成、畳み込み、
 プーリングを行う各関数の定義(この記事)
②ネットワークの記述
③誤差関数と学習部分の記述
④入力データ(画像)の前処理
⑤学習させてみる

CNNの畳み込み・プーリング等の各操作や、
誤差関数、その最小化アルゴリズムなど機械学習の
基礎知識については、ある程度理解が出来ているもの
としてお話を進めていこうと思います。

それでは早速今回の内容に入りたいと思います。

CNNでは、この記事の画像にもあるように、
まずは畳み込み・プーリングと呼ばれる、画像データから
特徴を取りだしていく操作を行っていきます。
また、これらの操作を一定回数繰り返した後に、
各ニューロンがとらえた特徴の情報を統合する、
全結合層の計算を行います。

今回は、繰り返し使用する
・各層の重みの生成(畳み込み層・全結合層で共通)
・各層のバイアスの生成(〃)
・畳み込み操作
・プーリング操作
の各関数を作成していきます。

まずは、まとめてコードを載せてしまおうと思います。
関数定義の順番は、上記と同様です。

コード
import tensorflow as tf

# 重みの生成
def set_weight(shape):
    w = tf.Variable(tf.truncated_normal(shape, stddev=0.1))
    return w

# バイアスの生成
def set_bias(shape):
    b = tf.Variable(tf.constant(0.1, shape=shape))
    return b


# 畳み込み層の計算
def convolution(x, w):
    return tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='SAME')

"""
第1、2引数はそれぞれ入力データ、重み
第3引数のstridesは、最初と最後は1で固定、真ん中2つがそれぞれ縦横のストライド幅
今回は、1画素ずつずらしていくことにするので、それぞれ1としました
第4引数のpaddingは、パディングの方法。今回は0パディングを行う'SAME'を指定
パディングを行わない場合は、'VALID'とします
"""

# プーリング層の計算
def pooling(x):
    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')

"""
max_poolとある通り、今回は最大値プーリングを使用します
第1引数は入力データ(基本的には畳み込み層からの出力)
第2引数はプーリングサイズ。最初と最後は1で固定で、真ん中2つがプーリングのサイズ
今回は2*2で画像を切り分けてプーリングしていくので、それぞれ2にしてあります
また、それに合わせてstridesも2にしてあります
"""

畳み込みとプーリングについては、
コード中に説明をほとんど書いておきました。
重み、バイアスについては基本的に前に
実装を行ったTensorFlowによる回帰分析②と同じです。

重みは、平均0、標準偏差0.1の正規分布に従い
初期化、バイアスは0.1で初期化しています。

次回は、ここで作成した関数を使用しながら、
CNNでの計算フローを記述していきたいと思います。

それでは、今回はここまでにしましょう。
お疲れ様でした!

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