web-dev-qa-db-ja.com

Keras Conv2DTransposeの出力形状を理解する

Keras.layers.conv2dtransposeの出力形状を理解するのに苦労しています

これがプロトタイプです:

keras.layers.Conv2DTranspose(
    filters,
    kernel_size,
    strides=(1, 1),
    padding='valid',
    output_padding=None,
    data_format=None,
    dilation_rate=(1, 1),
    activation=None,
    use_bias=True,
    kernel_initializer='glorot_uniform',
    bias_initializer='zeros',
    kernel_regularizer=None,
    bias_regularizer=None,
    activity_regularizer=None,
    kernel_constraint=None,
    bias_constraint=None
)
 _

ドキュメント( https://keras.io/layers/convolutional/ )で、私は読みました:

If output_padding is set to None (default), the output shape is inferred.
 _

コード( https://github.com/keras-team/keras/blob/master/keras/layers/convolutional.py )==)

out_height = conv_utils.deconv_length(height,
                                      stride_h, kernel_h,
                                      self.padding,
                                      out_pad_h,
                                      self.dilation_rate[0])
out_width = conv_utils.deconv_length(width,
                                     stride_w, kernel_w,
                                     self.padding,
                                     out_pad_w,
                                     self.dilation_rate[1])
if self.data_format == 'channels_first':
    output_shape = (batch_size, self.filters, out_height, out_width)
else:
    output_shape = (batch_size, out_height, out_width, self.filters)
 _

https://github.com/keras-team/keras/blob/master/keras/utils/conv_utils.py ):

def deconv_length(dim_size, stride_size, kernel_size, padding, output_padding, dilation=1):

    """Determines output length of a transposed convolution given input length.
    # Arguments
        dim_size: Integer, the input length.
        stride_size: Integer, the stride along the dimension of `dim_size`.
        kernel_size: Integer, the kernel size along the dimension of `dim_size`.
        padding: One of `"same"`, `"valid"`, `"full"`.
        output_padding: Integer, amount of padding along the output dimension, can be set to `None` in which case the output length is inferred.
        dilation: dilation rate, integer.
    # Returns
        The output length (integer).
    """

    assert padding in {'same', 'valid', 'full'}
    if dim_size is None:
        return None

    # Get the dilated kernel size
    kernel_size = kernel_size + (kernel_size - 1) * (dilation - 1)

    # Infer length if output padding is None, else compute the exact length
    if output_padding is None:
        if padding == 'valid':
            dim_size = dim_size * stride_size + max(kernel_size - stride_size, 0)
        Elif padding == 'full':
            dim_size = dim_size * stride_size - (stride_size + kernel_size - 2)
        Elif padding == 'same':
            dim_size = dim_size * stride_size
    else:
        if padding == 'same':
            pad = kernel_size // 2
        Elif padding == 'valid':
            pad = 0
        Elif padding == 'full':
            pad = kernel_size - 1

        dim_size = ((dim_size - 1) * stride_size + kernel_size - 2 * pad + output_padding)

    return dim_size
 _

CONV2DTRANSPOSEがCONV2Dのようなものであることを理解していますが、逆にしました。

CONV2DをKERNEL_SIZE =(3,3)、STRIDS =(10,10)およびPADDING =「同じ」に印加すると、200x200イメージが20×20画像を出力します。 、Stride =(10,10)とPADDING = "同じ" 20x20イメージへの画像は200x200のイメージを出力します。

また、CONV2DをKernel_Size =(3,3)で適用すると、195 x 195の画像へのストライド=(10,10)、およびpadding =「同じ」にも20 x 20の画像が出力されます。

そのため、CONV2DTRANSPOSEをKERNEL_SIZE =(3,3)、STRIDED =(ユーザが195 x 195に出力したい場合がある場合は、ユーザが出力を195 x 195にすることができる)または200x200、または他の多くの互換性のある形状)。

「出力形状が推論されている」と仮定します。デフォルトの出力形状がレイヤのパラメータに従って計算されることを意味し、必要に応じてデフォルトのものから出力形状の異なる出力を指定するメカニズムがあるとします。

これは言って、私は本当に理解していません

  • "output_padding"パラメータの意味

  • パラメータ「パディング」と「OUTPUT_PADDING」間の相互作用

  • 関数keras.conv_utils.deconv_lengthの関数内のさまざまな式

誰かがこれを説明することができますか?

どうもありがとう、

ジュリアン

6
Julien REINAULD

Conv2DTransposeでの最先端も、AutoEncoderを設計するときに私が心配しているものです。

ストライドは常に1であると仮定する。エンコーダ経路に沿って、各畳み込み層について、私はPADDING = '有効な'を選択し、これは私の入力画像がHxWであり、フィルタのサイズが大きくなることを意味し、層の出力は(H - (M-1))X(W-(N-1))。

復号化経路に沿った対応するCON2D翻訳層では、対応するCON2Dの入力サイズを再開するには、PADDING = 'FULL'を選択しなければならず、OUT_PADDING = NONEまたは0(差異なし)を選択する必要があります。入力サイズは、その周囲、すなわち上下の(M - 1)/ 2、つまり左右の(n - 1)/ 2で入力サイズを展開します。

TensorFlowを使用する場合は、PADDING =「同じ」、およびOUT_PADDING = 2 *((FILTER_SIZE-1)// 2)を選択する必要があります。それはケースの意図された行動であると思います。

ストライドが1ではない場合は、出力パディングを追加するには慎重に計算する必要があります。

Conv2D OUT_SIZE = FLOOR(IN_SIZE + 2 * PADDING_SIZE-FILTER_SIZE)/ストライド+ 1)

PADDING =「同じ」を選択した場合、Kerasは自動的にPADDING =(filter_size-1)/ 2を設定します。 「有効」を選択した場合、PADDING_SIZEは0に設定されます。これはN-D畳み込みの規約です。

逆に、con2dtranspose out_size =(IN_SIZE-1)* STRIDE + FILTER_SIZE-2 * PADDING_SIZE

pADDING_SIZEは、「パディング」オプションとOUT_PADDINGによって実際に数ピクセルを埋め込むかを指します。上記の説明に基づいて、Tensorflow上の「フル」オプションはありません、我々はその対応するCON2Dの入力サイズを再開するためにOUT_PADDINGを使用する必要があります。

あなたはそれが正しく働きかけて私に知らせてください。

要約すると、私はout_paddingがさまざまなバックエンドを促進するために使用されます。

0
Theron