転置畳み込みは(逆畳み込み)とは?画像生成に使われる手法を分かりやすく解説

スポンサーリンク
転置畳み込みは(逆畳み込み)とは画像生成に使われる手法を分かりやすく解説ディープラーニング
この記事を読んで分かること
  • 転置畳み込みは(逆畳み込み)とは何か
  • 転置畳み込み(逆畳み込み)の用途
  • 転置畳み込み(逆畳み込み)の計算方法

 

転置畳み込みは(逆畳み込み)とは?

転置畳み込みは(逆畳み込み)とは、

入力データを拡大してから畳み込みを行う処理

です。

 

逆畳み込みという名前から誤解されやすいのですが、畳み込みの逆プロセスではありません

畳み込みをする前の入力データを完全に復元するものでもないです。

 

以下は、転置畳み込み(逆畳み込み)のイメージのアニメーションです。

 

逆畳み込みのイメージ

出典:https://github.com/vdumoulin/conv_arithmetic

 

転置畳み込みは(逆畳み込み)では、入力データを拡大するためにデータを補完してから畳み込みを行います。

主なハイパーパラメータは2つあり、入力データを拡大する方法に影響します。

主なハイパーパラメータ
  • stride
  • padding

 

ハイパーパラメータは普通の畳込み処理と同じですが、処理の内容が異なります。

具体的な処理については後ほど説明します。

 

 

転置畳み込み(逆畳み込み)の用途

転置畳み込み(逆畳み込み)では入力のデータを拡大する効果があるため、一度畳み込みで圧縮したデータをもとのサイズに戻すような使われ方をします。

このような処理はセグメンテーション生成分野などでよく現れます。

 

転置畳み込みは以下のアーキテクチャで利用されています。

転置畳み込みを使ったアーキテクチャ
  • FCN(前奏畳み込みネットワーク)
  • U-Net
  • SegNet
  • VAE
  • DCGAN

 

転置畳み込み(逆畳み込み)の処理

転置畳み込み(逆畳み込み)とは具体的にどんな処理をしているかというと、以下のような手順になります。

手順
    • ステップ1
      strideに応じて入力データを拡張する
    • ステップ2
      入力データの周囲に余白を取る
    • ステップ3
      paddingに応じて余白を削る
    • ステップ4
      畳み込み処理を行う

 

ステップ1:strideに応じて入力データを拡張する

まず、strideで指定した行数分(列数)だけ入力データのピクセル間に余白を入れます。

入力データ(3×3)のピクセル間に余白を入れるとこのようになります。

転置畳み込みstrideの処理

 

 

ステップ2:入力データの周囲に余白を取る

次に入力データの外側に余白を追加します。

追加する行数(列数)はカーネルのサイズに依存し、カーネルのサイズより1行(1列)少ない数だけ余白を追加します。

入力データ(3×3)の外側に余白を入れるとこのようになります。

転置畳み込み_余白を取る処理

 

ステップ3:paddingに応じて余白を削る

paddingで指定した行数分(列数)だけ外側の余白を削っていきます。

入力データ(3×3)、カーネルサイズ(3×3)のデータに対して、余白を削るとこのようになります。

転置畳み込み_paddingの処理

 

ステップ4:畳み込み処理を行う

最後に普通の畳込みをしていきます。

畳み込みの処理についてはこちらの記事で紹介しています。

畳み込み層(Convolutionレイヤ)とは?画像分析に使われる手法を分かりやすく解説
畳み込み層(Convolutionレイヤ)とは? 畳み込み層(Convolutionレイヤ)とは、 入力データに対して畳み込み演算を行う層 です。 畳み込みとは具体的にどんな処理をしているかというと、入力データの一部に対...

 

転置畳み込み(逆畳み込み)の具体例

手順を説明しましたがイメージが掴みづらいかと思うので、いくつか具体例を見てみましょう。

入力データ(2×2)、カーネルサイズ(2×2)として計算してみます。

転置畳み込み_入力データ

 

stride=1, padding=0の例

転置畳み込み_stride1_oadding0

ステップ1ではstride=1なのでピクセル間の余白はなく、入力データはそのままになります。

ステップ2ではカーネルサイズが2なので、(2-1)行,列の余白を追加しています。

ステップ3ではpadding=0なので、特に処理は行っていません。

 

stride=2, padding=0の例

転置畳み込み_stride2_oadding0

ステップ1ではstride=2なのでピクセル間に1行,列の余白を挿入しています。

ステップ2ではカーネルサイズが2なので、(2-1)行,列の余白を追加しています。

ステップ3ではpadding=0なので、特に処理は行っていません。

 

stride=2, padding=1の例

転置畳み込み_stride2_oadding1

ステップ1ではstride=2なのでピクセル間に1行,列の余白を挿入しています。

ステップ2ではカーネルサイズが2なので、(2-1)行,列の余白を追加しています。

ステップ3ではpadding=1なので、外側の余白を1行削っています。

 

まとめ

転置畳み込みは(逆畳み込み)とは、入力データを拡大してから畳み込みを行う処理です。

転置畳み込み(逆畳み込み)では入力のデータを拡大する効果があるため、一度畳み込みで圧縮したデータをもとのサイズに戻すような使われ方をします。

このような処理はセグメンテーション生成分野などでよく現れます。

 

参考文献

GitHub - vdumoulin/conv_arithmetic: A technical report on convolution arithmetic in the context of deep learning
A technical report on convolution arithmetic in the context of deep learning - vdumoulin/conv_arithmetic
FCN (Fully Convolutional Network):ディープラーニングによるSemantic Segmentation手法
一般物体検出の歴史からちょっと脇道に逸れて、ディープラーニングによるSemantic Segmentationについて勉強する。 Semantic Segmentation 画像の領域を分割するタスクをSegmentation(領域分割)と

 

コメント

タイトルとURLをコピーしました