tensorflowメモ(手書き文字認識その3)
前回の続き。
モデルを畳み込みニューラルネットワーク (Convolutional Neural Network)に変更してみる。
チュートリアルなどを見ると、畳み込み層を2回通しているケースが多いが、まずは1層のモデルで試してみる。
パラメータは以下のとおりとした。
(参考)kerasのmodel.summary()によるモデル表示
学習で更新されるパラメータ数の内訳
# 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個)
この各フィルタを、入力画像(0から1の範囲に正規化済み)
に対して適用すると以下の出力が得られる(バイアス項は加えていない状態)
白寄りの部分が正の値、黒寄りの部分が負の値であることを示している。
この状態からフィルタごとのバイアスを加算し、活性化関数(ReLU)を通して負の値を0にした後、最大プーリング処理が行われる。
結果、負の値(黒寄りの部分)は除かれ、正の値(白寄りの部分)が特徴の判定材料として残ることになる。