●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層目になります。 |
最初ページへ
目次へ戻る |