🙆♀️
【E資格対策】実装・計算問題 完全攻略ノート(CNN & MLP)
【E資格対策】実装・計算問題 完全攻略ノート(CNN & MLP)
E資格の午後試験(コーディング・計算)で頻出の、「畳み込み演算の手計算」、 「CNNの実装」、 「多層パーセプトロン(MLP)の実装」 を1つの記事にまとめました。
これらは配点が高く、暗記していれば即答できる得点源です。試験直前の見直し用にどうぞ。
第1部:畳み込みニューラルネットワーク (CNN)
1. 畳み込み演算の手計算(パズル)
試験でよく出る「入力画像とフィルターから、出力値を計算せよ」という問題の解法です。
基本ルール: フィルターを入力に重ねて、「同じ位置の値を掛けて、全部足す(積和演算)」。
計算例
入力の一部とフィルターが以下の場合:
-
入力(パッチ):
\begin{pmatrix} 1 & 2 & 3 \\ 0 & 1 & 2 \\ 3 & 0 & 1 \end{pmatrix} -
フィルター:
\begin{pmatrix} 2 & 0 & 1 \\ 0 & 1 & 2 \\ 1 & 0 & 2 \end{pmatrix}
計算手順:
出力サイズの公式(暗記必須)
(
2. Convolutionレイヤの実装 (im2col)
Pythonで実装する際、for文を使うと遅いため im2col で行列計算に変換します。
順伝播 (Forward)
「画像を横長の行列」に、「フィルターを縦長の行列」に変換して、一発で掛け算します。
def forward(self, x):
FN, C, FH, FW = self.W.shape
N, C, H, W = x.shape
out_h = 1 + int((H + 2*self.pad - FH) / self.stride)
out_w = 1 + int((W + 2*self.pad - FW) / self.stride)
# 1. 入力を行列に展開 (im2col)
col = im2col(x, FH, FW, self.stride, self.pad)
# 2. フィルターも行列に展開 (reshape)
col_W = self.W.reshape(FN, -1).T
# 3. 行列積とバイアス加算
out = np.dot(col, col_W) + self.b
# 4. 4次元配列に戻す (transposeに注意!)
# (N, OH, OW, FN) -> (N, FN, OH, OW)
out = out.reshape(N, out_h, out_w, -1).transpose(0, 3, 1, 2)
return out
Discussion