CNNの出力サイズの計算ツール

畳み込みニューラルネットワーク(CNN)の層を並べて、各層の出力の大きさと、学習するパラメータの数、推論で必要な積和演算の回数を計算します。出力サイズの公式やパラメータ数の数え方を、例で確かめられます。

入力と層

conv K S P C = 畳み込み(カーネル K×K、ストライド S、パディング P、出力チャネル C)/ pool K S = 最大値・平均プーリング(K×K、ストライド S)/ flatten = 1列に並べる / fc N = 全結合(出力 N)。# から後はコメント。

計算結果

最後の層の出力
–
パラメータ数の合計
–
積和演算の回数の合計
–

縦横の端数は切り捨てます。積和演算の回数は、1枚の入力を推論するときの掛け算と足し算の組の数で、バイアスの加算と活性化関数・プーリングの計算は含めません。

出力サイズの公式

畳み込みやプーリングの出力の縦(横も同じ)は、⌊(入力 + 2 × パディング − カーネル) ÷ ストライド⌋ + 1 です。カーネルを入力の上でストライドずつずらしたとき、はみ出さずに置ける位置の数を数えています。例「28×28の画像に5×5の畳み込みと2×2のプーリング」では、(28 − 5) ÷ 1 + 1 = 24 で 24×24、続く2×2・ストライド2のプーリングで (24 − 2) ÷ 2 + 1 = 12 なので 12×12 になります。カーネル3×3でパディング1・ストライド1にすると、縦横は変わりません。

パラメータ数の数え方

畳み込み層の重みは、出力チャネルごとに「カーネル × カーネル × 入力チャネル」個あり、これに出力チャネルの数のバイアスが加わります。例「LeNet-5」の最初の層は 5 × 5 × 1 × 6 + 6 = 156 個です。全結合層は「入力の数 × 出力の数 + 出力の数」で、16 × 5 × 5 = 400 個の値を120個に結ぶ層は 400 × 120 + 120 = 48,120 個になります。プーリング層と flatten にパラメータはありません。LeNet-5 全体では 61,706 個です。

積和演算の回数と計算量

畳み込み層では、出力の1つの値を求めるのに「カーネル × カーネル × 入力チャネル」回の積和が必要で、それを出力の縦 × 横 × チャネルの数だけ繰り返します。例「VGG の最初のブロック」では、224×224 の画像に3×3・64チャネルの畳み込みを2回行うだけで約19億回の積和になります。パラメータの多くは全結合層に、計算量の多くは解像度の高い最初のほうの畳み込み層に集まるのが、CNN の典型的な姿です。

畳み込みが全結合より少ないパラメータで済む理由

全結合層は入力のすべての値と出力のすべての値を結ぶので、32×32 の画像を6個の 28×28 の出力に全結合でつなぐと約480万個の重みが必要です。畳み込み層は、小さなカーネルを画像のどの位置でも同じ重みで使う(重みの共有)ので、156個で済みます。近くの画素どうしの関係を調べる局所性と、位置がずれても同じ特徴を見つけられることが、画像に CNN が向く理由です。

関連する問題を解く

入力が64個、出力が32個の全結合層(各出力にバイアスが1つずつある)の、学習するパラメータの数はどれか。

  1. A96
  2. B2048
  3. C2080
答えと解説を見る

正解:C. 2080

全結合層では、すべての入力とすべての出力の組に1つずつ重みがあるので、重みは 64 × 32 = 2048個です。これに出力ごとのバイアスが32個加わるので、パラメータは 2048 + 32 = 2080個です。一般に、入力がn個、出力がm個の全結合層のパラメータは (n + 1) × m 個です。畳み込み層では同じフィルタを画像の全体で使い回すので、同じ大きさの入力でも全結合層よりパラメータがずっと少なくなります。

28×28の1チャネルの画像に、5×5のフィルタで畳み込み(ストライド1、パディングなし)を行い、続けて2×2の最大値プーリング(ストライド2)を行う。出力の縦と横の大きさはどれか。

  1. A12×12
  2. B14×14
  3. C24×24
答えと解説を見る

正解:A. 12×12

畳み込みの出力の大きさは、入力の大きさをN、フィルタの大きさをF、パディングをP、ストライドをSとして (N + 2P − F) ÷ S + 1 で求めます。(28 + 0 − 5) ÷ 1 + 1 = 24 なので、畳み込みのあとは24×24です。2×2の最大値プーリングをストライド2で行うと、2×2の領域ごとに最大値を1つだけ残すので、縦と横が半分の12×12になります。プーリングには学習するパラメータがなく、データを小さくして計算を減らし、位置の小さなずれの影響を受けにくくする働きがあります。

よくある質問

パディングとストライドは何のためにありますか?

パディングは入力の周りを0などで埋めて、出力が小さくなりすぎるのを防ぎ、端の画素も中央と同じ回数だけ使われるようにします。ストライドはカーネルをずらす幅で、2にすると縦横が約半分になり、プーリングの代わりに解像度を下げる目的で使われます。

割り切れないときはどうなりますか?

公式の割り算の端数は切り捨てます。たとえば縦7にカーネル2・ストライド2のプーリングを行うと、(7 − 2) ÷ 2 + 1 = 3.5 で、出力は3になり、最後の1行は使われません。フレームワークによっては、端数を切り上げる設定や、出力が入力 ÷ ストライドになるように自動でパディングする設定(same)もあります。

積和演算の回数から推論の時間は分かりますか?

目安になります。1回の積和を2回の演算(FLOP)と数えることが多く、積和19億回は約3.9 GFLOP です。ただし実際の時間は、メモリから重みや中間結果を読み書きする量や、計算機の並列度で大きく変わります。

試験ではどのように問われますか?

G検定や応用情報技術者試験、大学の講義では、入力の大きさ・カーネル・ストライド・パディングから出力の大きさを求める問題や、畳み込み層・全結合層のパラメータ数を求める問題がよく出ます。

関連する用語

畳み込みニューラルネットワーク(CNN) 活性化関数

関連する計算ツール

半導体・電子回路・情報の計算ツール →