6層目を計算するためには5層目の計算が終了していること!

 6層目はこのファイル(conv_layer6.xlsm)のVBAを実行してEXCELシートを生成しますが、それには
条件があります。

@前節で使用したconv_layer5.xlsmがconv_layer6.xlsmと同じディレクトリに存在すること。
A前節で使用したconv_layer5.xlsmのVBAマクロをすべて実行していること。

B前節で使用したconv_layer5.xlsmを保存して閉じていること。

●入力画像はVBAで5層目から転写する

 それではconv_layer6.xlsmを開いてみましょう。シートが1枚(W6_Bias)だけあります。肝心の入力画像がありませんが、それらはVBAマクロを実行してconv_layer5.xlsmから
転写して自動生成します。

 まずは図8-40のように「開発」タブからVisual Basicをクリックしましょう。



  図8-40 開発タブからVisual Basic


●VBAマクロを開いて走らせる

 左枠のVBA ProjectからModule1をダブルクリックすると図8-41のように
Sub layer6_inから始まるVBAマクロが現れます。三角マークをクリックして実行しましょう。



  図8-41 VBAを起動してモジュールを開きマクロを実行


●入力画像は前層のEXCELの結果を転写したもの

 すると入力画像のシート64枚が自動生成されます(図8-42)。これらは5層目の結果であり、conv_layer5.xlsmから転写されたものです。畳み込み5層目の結果はこのように8x8画素ですが、それらをパディングして
10x10画素にしたものが6層目の入力となります。



  図8-42 6層目の入力画像が64枚生成される。5層目の出力と比べてみよう

●9個のVBAマクロを順番に実行する

 その後は5層目と同じようにひたすらVBAマクロを実行します。表2-03の
順にすべて実行してください。

  表2-03 VBAマクロ一覧
モジュール名 マクロ名 機能 シートの数
Module1 Sub layer6_in 入力画像生成(前層から転写) 64
Module2 Sub layer6_im2col im2col関数 64
Module3 Sub layer6_mmult 行列乗算 64
Module4 Sub layer6_all 64シートの加算 1
Module5 Sub layer6_truncate 8ビット右シフト(1/256) 1
Module6 Sub layer6_plus バイアス加算 1
Module7 Sub layer6_relu ReLU関数+255でリミッタ 1
Module8 Sub layer6_out 64チャネルに分割 64
Module9 Sub layer6_pool プーリング 64

●重み係数とバイアスのシートだけはPythonからコピペしたもの

 最初のシート(W6_Bias)には重み係数とバイアスがあります。これはPythonからCSV形式で書き出したものをコピペしたものです(図8-43)。縦方向に576個ありますが、これはこの層の入力が64チャネルあることによります(9×64)。横方向には64個ありますが、これはこの層の出力が64チャネルになるということです。



  図8-43 シートW6_Biasは6層目の重み係数とバイアスがある


 図8-44はVBAマクロModule8, Sub layer6_outを実行した結果で、outCh00〜63の64枚あります。それぞれ8×8画素からなります。



  図8-44 マクロModule8, Sub layer6_outを実行すると64チャネル得られる


●Pythonで実行した結果と比較する

 図8-45は
Pythonで6層目を実行した結果です。EXCELで計算したものとピタリ一致しています。全部で64チャネルあるので皆一致することを確認します。



  図8-45 PythonをAnaconda Jupyter Labで走らせた結果


●最後にプーリングを施して6層目の結果は4x4画素になる

 最後のマクロModule9, Sub layer6_poolを実行した結果は図8-46です。プーリングにより8×8画素を4×4画素に間引き、これが次の層の入力になります。



  図8-46 プーリングで間引いた結果4x4に

●「畳み込み」は6層目で終わり、次の層は「全結合」の1層目になります。

最初ページへ


目次へ戻る