デコンボリューションの原理+ pytorchデコンボリューションレイヤーパラメーターoutput_padding



Deconvolution Principle Pytorch Deconvolution Layer Parameter Output_padding



一般に、2次元畳み込みの計算は、次の3つのカテゴリに分類されると考えられます。

1.完全2.同じ3.有効



参照:https://cn.mathworks.com/help/matlab/ref/conv2.html?

同じで有効なのは、すべての学生が精通していると信じています。有効とは、パディング操作が実行されないことを意味します。これは、畳み込みが変更されないまま(入力画像に対して)、フィーチャマップサイズを出力するためのパディングと同じです。もちろん、同じモードは完全な入力と出力のサイズを意味するのではなく、畳み込みカーネルのステップサイズとも関係があります。たとえば、画像サイズが6 * 6で、ステップサイズが2の場合、その後に出力される画像のサイズは6/2 = 3になります。したがって、問題は、入力画像が5 * 5の場合です。ステップサイズは2ですか? padding =(kernel_size-1)/ 2を選択すると、出力も3 * 3になります。



有効

同じ

(画像ソース: 畳み込みの3つのモード:完全、同じ、有効 )。



これは、今日私たちが焦点を当てたい問題です。 ステップサイズが1より大きい場合、同じパディング=(kernel_size-1)/ 2が選択されていると、異なるサイズのフィーチャマップが同じサイズの出力を取得できます。

これは、タイトルの「再畳み込み」と何の関係がありますか?そして、私たちはフルモードを忘れていますか?さて、ゆっくり話しましょう。

完全なデコンボリューション

最初に1つ話させてください 深刻ではない しかし、アイデアは簡単に理解できます。

有効なのは「純粋な」畳み込み、完全なのは「純粋な」デコンボリューションです。

いわゆる「純粋」とは、パディング操作がないことを意味します。 「不純物」操作では、入力サイズと出力サイズをステップサイズの期待値に一致させる特殊なケースがあります。これは同じと呼ばれます。

参照: ディープラーニング|デコンボリューション/転置畳み込み転置conv / deconvの理解

データ

フル

ストライドのデコンボリューション> 1

ステップサイズが1より大きいデコンボリューションは、入力フィーチャユニット間で計算されます ストライダーを挿入-10 0を挿入すると、新しい機能の入力と見なされます。デコンボリューションは、フラクショナルストライドコンボリューションと呼ばれることもあります。 フラクショナルステップ 畳み込み。 参照:転置畳み込み、分数ストライド畳み込み、またはデコンボリューション

アニメーションと組み合わせた場合の比較画像ですか?たとえば、元の畳み込み演算は、データを入力から出力に段階的にマッピングします。ステップサイズが2の場合、マップ全体で入力側から取得する情報が少なくなり、出力も当然少なくなります。デコンボリューションは、ハーフステップ(小さなステップ)のマッピングです。入力からオブジェクトを取得し、それを出力に2回マップする場合、出力は当然より多くなります。 (カザフスタンの厳密な理解ではありません)

長い間話し合った後、私はついに私のブログ投稿の原因を思いつきました。それは、pytorchでです。

nn.ConvTranspose2d()

入出力チャネルの一般的な数、畳み込みカーネルサイズなどに加えて、パラメーターを渡すときに少し不可解なパラメーターがあります。 output_padding

ステップサイズが1のデコンボリューションを実行する場合、このパラメーターは処理されません。ただし、ステップサイズが1より大きい場合は、ネットワークエラーを回避するために手動で設定する必要があります。では、このパラメータは正確に何をしているのでしょうか?実際、ソースコードには次のような指示があります。

無知の感覚はありますか(まあ、そうではないかもしれません)、なぜ私が前に話したいのかが少しはっきりしていますか?

  1. ステップサイズが1畳み込みサイズより大きい場合、対応するさまざまな状況があります。
  2. デコンボリューションは、(サイズ計算の観点から)コンボリューションの逆です。

問題は、異なるサイズの画像が畳み込み後に同じサイズに出力され、逆に出力される可能性があることです。 異なるサイズの合法的な出力があるかどうかにかかわらず、同じ入力画像はデコンボリューションを受けますか? ?これは物議を醸しています。これが実際に当てはまるかどうかを確認しましょう。

借りて 参照ブログ投稿 例:

畳み込みプロセスでは、7 * 7入力サイズ+ステップサイズは2+畳み込みカーネル3 * 3 = 3 * 3出力サイズであることがわかります。これは完全な畳み込みカーネルスライディングプロセスです。しかし、青いストローク×で画像の領域を観察すると、その場所は畳み込みではないことがわかります。つまり、データがある場合、つまり8 * 8と入力した場合、出力は3 * 3のままです。原作者はそう説明しました:

商が整数でない場合は、切り捨てる必要があります。シンボル⌊⌋⌊⌋の使用方法は、フロア実装の原則とも呼ばれ、青いフレームが画像または塗りつぶされた画像に完全に含まれている場合にのみ操作することです。青いフレームのいずれかが外側に移動した場合は、乗算する必要はありません。これは慣例です。 3×3フィルターは、完全に画像内または塗りつぶし後の画像領域に配置するのが通例です。

では、デコンボリューションはどうですか? 3 * 3入力には2ステップのデコンボリューションがあり、7 * 7出力と8 * 8出力は合法であると考えるのは自然なことです。しかし、どれが私たちに必要なものですか?

それでもこの写真では、実際には同じパディングのデコンボリューションを使用していることに気付きました(青い入力画像には外層にp =(s-1)/ 2のパディングがあります)。したがって、実際にはそれを期待しています。入力と出力は次のとおりです。ステップ(2)で(PS:3 * 3入力ステップサイズは2、7と8は正当な出力であり、同じではなく、「純粋な」デコンボリューションです)が、表示されるのは次のとおりです:入力青3 * 3、出力緑5 * 5。これは私たちの期待ではありませんが、5 * 5の人々も合法的な成果です。ただし、前の説明に基づいて、6 * 6もここでの正当な出力であることがわかっているので、どちらが適切ですか?

Output_paddingパラメーター

私は本当に物議を醸す状況の存在を見ました。次に、pytorchは、output_paddingパラメーターを使用して論争を排除し、ウィットマティックに解決策を提案します。それでは、どのように機能しますか?

まず、1つの前提に同意する必要があります。 ほとんどの場合、畳み込み/デコンボリューションプロセス後の画像サイズ比を同じモードであるステップサイズと等しくする必要があります。 。したがって、pytorchはパラメータのパディング(output_paddingとの違いに注意)を(kernel_size-1)/ 2に設定します。これは、ソースコードのコメントで確認できます。

次に、デコンボリューションのサイズを計算するための式を示します。

期待に応えるために入力と出力のサイズを満たすために、少しの操作で知ることができます(ここではoutput_paddingを無視します)。

必要性:パディング=(kernel_size-ストライド)/ 2

pytorchの提案を比較してください:padding =(kernel_size-1)/ 2

今それをもう一度置きます output_padding 入ってくることを検討してください。つまり、最高のoutput_paddingを取得する必要があります ストライド-1 このようにして、入力と出力を比例させることができます。他の値の計算を行うことは可能ですか?はい、このデコンボリューションの計算を妨げることはありませんが、ネットワークの背後にあるサイズ関連の操作に注意を払う必要があります。この時の出力は入力サイズ※ストライドではありません。

総括する

畳み込みカーネルのスライディングプロセス中の境界条件の不確実性により、さまざまな正当な出力サイズが1より大きいステップサイズでデコンボリューションに表示されます。 pytorchのデコンボリューションレイヤーは、ユーザーが出力を選択するためのoutput_paddingを提供します。入力と出力のサイズをステップサイズに比例させたい場合は、通常、output_paddingが使用されます。ストライド-1、同時にパディング (kernel_size-1)/ 2

参考資料: 畳み込みニューラルネットワークCNN(1)-画像の畳み込みとデコンボリューション(畳み込み後、転置畳み込み)