今回はResNetの改良版とも言えるDeseNetの特徴をできるだけシンプルに解説してみたいと思います。
ResNetの知識が前提となりますので、ちょっと自信が無いという方はまず↓の記事から始めてみてください。
それでは、早速DenseNetの説明に入っていきます。
DenseNetの特徴
まず始めにDenseNetの全体像を示しておきます。
Densely Connected Convolutional Networks
左側が入力、右側が出力(画像認識結果)です。ここでは、馬の写真を入力として、ニューラルネットワークが馬だと判定する過程を示しています。
ところどころにConvolution(畳み込み)と画像のサイズを調整するためのPooling(プーリング)があるのが分かると思います。そして、それらの間にDense Blockと呼ばれる構造があります。このDense BlockがDenseNetの要なので、後ほど改めて説明します。
一番最後は、AlexNet、VGG、GoogleNetなどの従来のモデルと同じように、全結合層を経て出力となります。
Dense Block
先ほども言いましたが、このDense BlockがDenseNetの最も顕著な特徴です。
Dense Blockの内部構造を以下に示します。
まず直線の黒い矢印で示したのがCNNの一般的な流れで、入力された画像が畳み込みと活性化関数を経て出力へ流れていきます。
一方、曲線の矢印は全てスキップ接続です。
ResNetが次の入力へのスキップ接続しか無かったのに対して、Dense Blockではさらに先まで複数のスキップ接続が伸びていることが大きな違いの1つです。
例えば、青からのスキップ接続はその先にある緑、紫、黄の3つに対して行われています。ResNetであれば、青から発するスキップ接続は緑に対してだけです。このように、DenseNetでは前にある全てのノードに対してスキップ接続を行ないます。
もう1つの大きな違いはスキップ接続の中身です。それを説明するために、ResNetのスキップ接続を掲載します。
ResNetのスキップ接続では$F(x)~+~x$とあるように、画像の要素(ピクセル)同士を加算します。そのため、例えば$x$が16ch(チャンネル)、$F(x)$が16chの場合に$F(x)~+~x$のチャンネル数は16chのままです。繰り返しになりますが、画像の要素同士を加算するので、チャンネル数は増えません。
では、DenseNetはどうでしょうか?その説明のためにもう1度Dense Blockの構造を掲載します。
DenseNetのスキップ接続では、入力と出力を加算するのではなく、連結します。
具体例を見てみましょう。こちらの図では最初の入力が16ch、$A$の畳み込みを経た出力が32chです。DenseNetでは入力と出力を連結するため、$B$への入力は$16+32=48ch$となります。
同様に考えると、Bからの出力は32chですが、①からのスキップ接続の16ch、②からのスキップ接続の32chがあるので、$C$への入力は$16+32×2=80ch$となります。
これが「入力と出力を連結する」という言葉の意味です。この点もResNetとは大きく異なる点です。
さて、ここまでの具体例による説明を踏まえると、Dense Blockからの出力がもつチャンネル数は以下のような公式で表現することができます。
$k_{0}~+~kl$
$k_{0}$:Dense Blockへの入力チャンネル数
$k$:Dense Blockの各層の出力チャンネル数
$l$:Dense Block内の層数
今回の具体例でいうと、$k_{0}=16、k=32、l=3$となるため、Dense Blockからの出力チャンネル数は$16~+~32×3=108ch$となります。
ちなみに、$k$はDenseNetの論文の中では成長率(Growth Rate)と呼ばれています。
Transition Layer
次の特徴がTransition Layerです。その説明のためにDenseNetの全体構成を再掲します。
先ほど説明したように、Dense Block内では入力と出力を連結するため、画像サイズを変えることができません。例えば、128×128の画像同士は連結できますが、128×128と64×64の画像は連結できません。
しかし、だからと言って、「画像サイズを変更してはいけない」という制約がついてしまうのも不都合です。画像(正確には画像の特徴マップ)を圧縮することは重要だからです。
そのため、DenseNetでは、Dense Blockの間にプーリング層を挿入して画像サイズを変更しています。これをTransition Layerと呼んでいます。
スキップ接続を行なうのはDense Block内の話なので、Dense Block間でサイズが変わることは問題になりません。
Transition Layerを確認していただくため、DenseNetの全体像を再掲します。
Densely Connected Convolutional Networks
DenseBlockの間にプーリング層があるのがご覧いただけると思います。これがTransition Layerです。
DenseNetの性能
DenseNetとResNetでImageNetの画像(ILSVRCで使われる画像データ)を用いて、ご認識率を比較した結果が論文に掲載されています。
Densely Connected Convolutional Networks
グラフは横軸がモデルのパラメータの数、縦軸が誤認識率です。
このグラフを見れば、DenseNet(青線)がResNet(赤線)よりも少ないパラメータ数で低い誤認識率を達成していることが分かります。
つまり、DenseNetはResNetに比べて軽量かつ高性能という結論になっています。
以上がDenseNetの特徴の説明です。
最後になりますが、より詳しく学んでみたいという方は、AIの基礎からAI搭載WEBアプリ開発まで学べるキカガク長期コースも是非活用してみてください!