0:00
みなさんこんにちは。
人工知能ラボの助手です。
今回からは、画像認識への応用で有名な、
畳み込みニューラルネットワーク(以下、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)実装② [ネットワークの記述]