ichou1のブログ

主に音声認識、時々、データ分析のことを書く

tensorflowメモ(手書き文字認識その3)

前回の続き。
モデルを畳み込みニューラルネットワーク (Convolutional Neural Network)に変更してみる。

チュートリアルなどを見ると、畳み込み層を2回通しているケースが多いが、まずは1層のモデルで試してみる。

パラメータは以下のとおりとした。
f:id:ichou1:20181218163944p:plain

(参考)kerasのmodel.summary()によるモデル表示

f:id:ichou1:20190103091254p:plain

学習で更新されるパラメータ数の内訳

# conv2d_1 Layer
filter: 3row * 3col * 32channel = 288
bias  : 32channel

# dense_1 Layer (Fully connected Layer)
weight : 512row * 10col = 5120
bias   : 10col

エポックを500回に設定したところ、精度は98%まで出た。

学習後のフィルターの状態を可視化してみる。

フィルターの範囲確認
-1.241  # 最小値
 1.417  # 最大値


前回は値"0"が中間の階調になるようスケーリングしたが、今回は最小値、最大値の範囲でグレースケールに変換。
ライブラリ「Matplotlib」を使って描画する。

plt.imshow(filter["filter_index"], cmap='gray', vmin='フィルター(最小値)', vmax='フィルター(最大値)', interpolation='none')
学習済みのフィルター(3行x3列、32個)

f:id:ichou1:20181218172517p:plain

この各フィルタを、入力画像(0から1の範囲に正規化済み)
f:id:ichou1:20181218172531p:plain

に対して適用すると以下の出力が得られる(バイアス項は加えていない状態)
f:id:ichou1:20181218172138p:plain

白寄りの部分が正の値、黒寄りの部分が負の値であることを示している。
この状態からフィルタごとのバイアスを加算し、活性化関数(ReLU)を通して負の値を0にした後、最大プーリング処理が行われる。
結果、負の値(黒寄りの部分)は除かれ、正の値(白寄りの部分)が特徴の判定材料として残ることになる。