2026年03月
新着記事
最近のコメント
月別
カテゴリ
2026.03.07 23:30

プーリング層のコーディング方針を整理


・プーリング層を考えることに。こちらのフォワード側は要するに2x2なり3x3といった領域に分割して、その領域を代表する値を作る。
・最もよく使われるのは最大値をとるMaxプーリングと呼ばれる手法らしい。
・たとえば2x2の領域ごとに分割してMaxプーリングするとき、入力が
 1 2 3 4
 4 8 6 7
 7 3 9 2
 4 8 3 7
という具合になっていれば出力は
 8 7
 8 9
となる。これはnp.maxを使うと割と簡単に抽出できる。

・入力は畳み込み層の出力なので、構造は[バッチサイズ,フィルタ数、 Xサイズ、Yサイズ]な4次元配列なので、ここからプーリングサイズ分切り出して
 xmax=np.max(x,axis=(2,3),keepdims=True)
して4次元配列まま最大値位置を取り出す。

・で、バックプロパゲーションのためには最大値がどの場所だったのかも記録しないといけない。こちらは
mask=np.where(x==xmax,1,0)
で一発でいける。めったに無いけど、運悪く全く同じ値になる場所が複数あったときには責任を分け合ったほうが良いのだろうか。もしやるなら、
mask=np.where(x==xmax,1,0)/np.sum(xmax,axis=(2,3),keepdims=True)
で良さそうだ。
・ただ、全部ゼロだったらまずいので、そこは避けないとだめだな。
・あとはバックプロパゲーションするときには戻ってきた行列(仮にerr_inとする)との乗算、つまり
 err_in*mask
をしてやれば、NumPyが勝手にブロードキャストしてくれるので、該当箇所だけ値が戻る形にしてくれる。
・…というのが、どうやらプーリング層の実装になるらしい。明日暇があったらコーディングして完成させよう。
・しかし、CNNってやたらと時間かかりそうだな。やはりもっとC/C++なりで作成された高水準ライブラリを使わないと駄目かもしれないな。
・とりあえず実際にMNIST認識をやらせてみてからPyTorchを使う方向も考えよう。

この記事へのコメント
コメントを書く
名前

タイトル

ホームページ

コメント

パスワード(削除用)
クッキー