転置畳み込みは(逆畳み込み)とは?
転置畳み込みは(逆畳み込み)とは、
です。
逆畳み込みという名前から誤解されやすいのですが、畳み込みの逆プロセスではありません。
畳み込みをする前の入力データを完全に復元するものでもないです。
以下は、転置畳み込み(逆畳み込み)のイメージのアニメーションです。
出典:https://github.com/vdumoulin/conv_arithmetic
転置畳み込みは(逆畳み込み)では、入力データを拡大するためにデータを補完してから畳み込みを行います。
主なハイパーパラメータは2つあり、入力データを拡大する方法に影響します。
ハイパーパラメータは普通の畳込み処理と同じですが、処理の内容が異なります。
具体的な処理については後ほど説明します。
転置畳み込み(逆畳み込み)の用途
転置畳み込み(逆畳み込み)では入力のデータを拡大する効果があるため、一度畳み込みで圧縮したデータをもとのサイズに戻すような使われ方をします。
このような処理はセグメンテーションや生成分野などでよく現れます。
転置畳み込みは以下のアーキテクチャで利用されています。
転置畳み込み(逆畳み込み)の処理
転置畳み込み(逆畳み込み)とは具体的にどんな処理をしているかというと、以下のような手順になります。
- ステップ1strideに応じて入力データを拡張する
- ステップ2入力データの周囲に余白を取る
- ステップ3paddingに応じて余白を削る
- ステップ4畳み込み処理を行う
ステップ1:strideに応じて入力データを拡張する
まず、strideで指定した行数分(列数)だけ入力データのピクセル間に余白を入れます。
入力データ(3×3)のピクセル間に余白を入れるとこのようになります。
ステップ2:入力データの周囲に余白を取る
次に入力データの外側に余白を追加します。
追加する行数(列数)はカーネルのサイズに依存し、カーネルのサイズより1行(1列)少ない数だけ余白を追加します。
入力データ(3×3)の外側に余白を入れるとこのようになります。
ステップ3:paddingに応じて余白を削る
paddingで指定した行数分(列数)だけ外側の余白を削っていきます。
入力データ(3×3)、カーネルサイズ(3×3)のデータに対して、余白を削るとこのようになります。
ステップ4:畳み込み処理を行う
最後に普通の畳込みをしていきます。
畳み込みの処理についてはこちらの記事で紹介しています。
転置畳み込み(逆畳み込み)の具体例
手順を説明しましたがイメージが掴みづらいかと思うので、いくつか具体例を見てみましょう。
入力データ(2×2)、カーネルサイズ(2×2)として計算してみます。
stride=1, padding=0の例
ステップ1ではstride=1なのでピクセル間の余白はなく、入力データはそのままになります。
ステップ2ではカーネルサイズが2なので、(2-1)行,列の余白を追加しています。
ステップ3ではpadding=0なので、特に処理は行っていません。
stride=2, padding=0の例
ステップ1ではstride=2なのでピクセル間に1行,列の余白を挿入しています。
ステップ2ではカーネルサイズが2なので、(2-1)行,列の余白を追加しています。
ステップ3ではpadding=0なので、特に処理は行っていません。
stride=2, padding=1の例
ステップ1ではstride=2なのでピクセル間に1行,列の余白を挿入しています。
ステップ2ではカーネルサイズが2なので、(2-1)行,列の余白を追加しています。
ステップ3ではpadding=1なので、外側の余白を1行削っています。
まとめ
転置畳み込みは(逆畳み込み)とは、入力データを拡大してから畳み込みを行う処理です。
転置畳み込み(逆畳み込み)では入力のデータを拡大する効果があるため、一度畳み込みで圧縮したデータをもとのサイズに戻すような使われ方をします。
このような処理はセグメンテーションや生成分野などでよく現れます。
参考文献
コメント