はじめに
PyTorchのチュートリアルPyTorch60分講座: ニューラルネットワーク入門を勉強しました。本記事では、チュートリアル記載のLeNetがどのように入力画像の次元数を変化させていくのかについてまとめようと思います。
なお、私もチュートリアルを読んでいる際に混乱したのですが、チュートリアルに記載のLeNetの構造を表した図と、チュートリアル中に書かれているコード(Netクラス)は若干構造が異なっています(図1)。本記事では、コードを正として説明します。

畳み込み演算による次元数の変化
本節では、畳み込み演算による入力画像の次元数の変化について説明します。下記のような設定とします。
- 入力画像
- チャネル数:
- 縦幅:
- 横幅:
- チャネル数:
- フィルタ
- 縦幅:
- 横幅:
- 縦幅:
- ストライド:
- 出力画像
- チャネル数:
- チャネル数:
このとき、畳み込み演算では次の手順にしたがって計算が行われます。
- まず、
個のフィルタが用意され、入力画像との積和をとる
- 次に、1で計算された出力の画素を全チャネルにわたって和をとる
- 上記の作業を
回行うことで、出力画像のチャネル数を
にする
図2は上記の作業をまとめたものです。

以上より、次元数がの入力画像が畳み込み演算によって、
に変化します。ただし、
は小数点以下を切り捨てて、整数に変換する関数です。
プーリングによる次元数の変化
本節では、プーリングによる入力画像の次元数の変化について説明します。とはいえ、畳み込み演算とほとんど同じです。下記のような設定とします。
- 入力画像
- チャネル数:
- 縦幅:
- 横幅:
- チャネル数:
- ウィンドウサイズ
- 縦幅:
- 横幅:
- 縦幅:
- ストライド:
- 出力画像
- チャネル数:プーリングではチャネル数が変化しないので、
のまま
- チャネル数:プーリングではチャネル数が変化しないので、
図3はプーリングの計算手順をまとめたものです。

以上より、次元数がの入力画像がプーリングによって、
に変化します。
LeNetによる次元数の変化
以上を踏まえて、LeNetが32×32の入力画像の次元数をどのように変化させるのかについて説明します。まず、LeNetの構造を改めて文字で書き起こします。
の畳み込み演算を行う
の最大値プーリングを行う
の畳み込み演算を行う
の最大値プーリングを行う
- 576次元のベクトルに変換する
- 576次元から120次元への線形変換を行う
- 120次元から84次元への線形変換を行う
- 84次元から10次元への線形変換を行う
以上の変換のうち、5~8は単純な線形変換です。したがって、次元数の変化は上記に書いてある通りなので説明しません。1~4の変換について次元数がどのように変化するのか説明します。
1の変換
畳み込み演算によって計算された出力画像の次元数は、でした。これに、
を代入することで、
となります。
2の変換
プーリングによって計算された出力画像の次元数は、でした。これに、
を代入することで、
となります。
3の変換
なので、1の変換と同様に計算すると
となります。
4の変換
なので、2の変換と同様に計算すると
となります。
以上より、1~4の変換によって32x32の画像が16x6x6=576次元のベクトルに変換できました。
LeNetに入力できる画像の範囲
ここからはおまけです。
畳み込み演算やプーリングによる出力画像の次元数の計算には、床関数()が含まれていました。したがって、入力画像のサイズが32x32と多少異なっていてもうまいこと床関数が次元数を調整し、576次元の全結合層に入力できるベクトルを得られる可能性があります。本節では、「入力画像のサイズを32x32からどれくらい変えてもLeNetに入力できるのか?」ということを考えようと思います。ただし、簡単のため入力画像は正方形とします。
まず、LeNetの入力画像の縦幅をとします。このとき、入力画像は正方形であることを仮定しているので横幅も
となります。この入力画像に1の畳み込み演算による変換を行うと、出力画像のサイズは、
となります。ただし、なので
となることを利用しました。
同様に2のプーリングによる変換を行うと、出力画像のサイズは、
となります。ここで、としておきます。
同様の計算方法で、3の畳み込み演算を行うと、出力画像のサイズは、
となります。また、4のプーリング演算を行うと、最終的な出力画像のサイズは、
となります。
このとき、上記の出力画像を576次元ベクトルに変換し全結合層に入力するので、
となります。これより、
となります。
一般的に、任意のに対して、
が成り立ちます。これを用いると、
から、
となります。
次にを使うと、
となり、ここから
となります。
以上のことから、LeNetに入力可能な画像のサイズは正方形の場合、30×30、31×31、32×32、33×33の4パターンに限られることがわかります。実際に、入力画像のサイズを変えて実行してみると、図4のような結果になりました。

コードにおいても入力画像が4パターンしかないことを示せました。
まとめ
本記事では、LeNetを題材に畳み込み演算とプーリングによって次元数がどのように変わるのかについて説明しました。また、LeNetに入力できる画像の範囲についても考察しました。