🙆‍♀️

【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}

計算手順:

\begin{aligned} (1\times2) &+ (2\times0) + (3\times1) \\ + (0\times0) &+ (1\times1) + (2\times2) \\ + (3\times1) &+ (0\times0) + (1\times2) \\ = 2 + 0 + 3 &+ 0 + 1 + 4 + 3 + 0 + 2 = \mathbf{15} \end{aligned}

出力サイズの公式(暗記必須)

OH = \frac{H + 2P - FH}{S} + 1

H:入力サイズ, P:パディング, FH:フィルターサイズ, S:ストライド)


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