0

Caffe で書かれた次の Colorization Modelを実装しています。Keras で指定する output_shape パラメータについて混乱しています

model.add(Deconvolution2D(256,4,4,border_mode='same',
output_shape=(None,3,14,14),subsample=(2,2),dim_ordering='th',name='deconv_8.1'))

ダミーの output_shape パラメータを追加しました。しかし、どうすれば出力パラメータを決定できますか? Caffe モデルでは、レイヤーは次のように定義されます。

layer {
 name: "conv8_1"
  type: "Deconvolution"
  bottom: "conv7_3norm"
  top: "conv8_1"
  convolution_param {
    num_output: 256
    kernel_size: 4
    pad: 1
    dilation: 1
    stride: 2
  }

このパラメーターを指定しないと、コードでパラメーター エラーが発生しますが、output_shape として何を指定すればよいかわかりません

ps は、データ サイエンス フォーラム ページで既に質問されていますが、回答はありません。ユーザーベースが小さいことが原因である可能性があります

4

1 に答える 1

1

Caffe デコンボリューション レイヤーはどのような出力形状を生成しますか?

特にこのカラー化モデルについては、論文の 24 ページ(GitHub ページにリンクされています) を参照してください。

カラー化モデルのアーキテクチャ

したがって、基本的に、元のモデルでのこのデコンボリューション レイヤーの出力形状は [None, 56, 56, 128] です。これは、output_shape として Keras に渡したいものです。唯一の問題は、以下のセクションで述べたように、Keras は実際にはこのパラメーターを使用して出力形状を決定するわけではないため、ダミーの予測を実行して、他のパラメーターが何を得るために必要かを見つける必要があることです。あなたがしたい。

より一般的には、デコンボリューション レイヤーの出力形状を計算するための Caffe ソース コードは次のとおりです。

    const int kernel_extent = dilation_data[i] * (kernel_shape_data[i] - 1) + 1;
    const int output_dim = stride_data[i] * (input_dim - 1)
    + kernel_extent - 2 * pad_data[i];

拡張引数が 1 の場合は、次のようになります。

    const int output_dim = stride_data[i] * (input_dim - 1)
    + kernel_shape_data[i] - 2 * pad_data[i];

パラメータがゼロの場合、これはKeras のドキュメントと一致することに注意してください。a

出力形状の計算式34 : o = s (i - 1) + a + k - 2p

Keras バックエンドで実際の出力形状を確認する方法

実際の出力形状はバックエンドの実装と構成に依存するため、これは注意が必要です。Keras は現在、自分でそれを見つけることができません。したがって、実際の出力形状を見つけるために、実際にはダミー入力で予測を実行する必要があります。Deconvolution2D の Keras ドキュメントからこれを行う方法の例を次に示します。

To pass the correct `output_shape` to this layer,
one could use a test model to predict and observe the actual output shape.
# Examples
```python
    # apply a 3x3 transposed convolution with stride 1x1 and 3 output filters on a 12x12 image:
    model = Sequential()
    model.add(Deconvolution2D(3, 3, 3, output_shape=(None, 3, 14, 14), border_mode='valid', input_shape=(3, 12, 12)))
    # Note that you will have to change the output_shape depending on the backend used.
    # we can predict with the model and print the shape of the array.
    dummy_input = np.ones((32, 3, 12, 12))
    # For TensorFlow dummy_input = np.ones((32, 12, 12, 3))
    preds = model.predict(dummy_input)
    print(preds.shape)
    # Theano GPU: (None, 3, 13, 13)
    # Theano CPU: (None, 3, 14, 14)
    # TensorFlow: (None, 14, 14, 3)

参考:https ://github.com/fchollet/keras/blob/master/keras/layers/convolutional.py#L507

また、output_shape パラメーターが実際には出力形状を定義していないように見えるのはなぜなのか知りたいと思うかもしれません。post Deconvolution2D layer in kerasによると、これが理由です:

Keras に戻り、上記がどのように実装されているかを説明します。紛らわしいことに、output_shape パラメーターは実際にはレイヤーの出力形状を決定するために使用されず、代わりに入力、カーネル サイズ、およびストライドから推測しようとしますが、有効な output_shapes のみが提供されていると仮定します (ただし、コードが該当します)。output_shape 自体は、backprop ステップへの入力としてのみ使用されます。したがって、必要な結果 (指定された入力形状、出力形状、およびカーネル サイズから Keras によって決定された可能性がある) を得るために、stride パラメーター (Keras のサブサンプル) も指定する必要があります。

于 2016-11-06T22:02:35.967 に答える