chainer.functions.deconvolution_2d(x, W, b=None, stride=1, pad=0, outsize=None)[source]

二次元 Deconvolution関数。.

 

これは二次元Deconvolutionの実装です。大半のディープラーニングのフレームワークや論文で、この関数は  transposed convolution(転置畳み込み)と呼ばれています。 しかし、歴史的な理由と (例えば Zillerの論文 Deconvolutional Networks) と後方互換製のために 、Chainerではこの関数を deconvolution と呼びます。

 

この関数は3つの変数(variable)をとります。すなわち、入力画像x、 フィルター荷重 W、そしてバイアスベクター bです。

 

表記法: これは次元の表記法です。

  • \(n\)はバッチサイズ
  • \(c_I\) と \(c_O\) はそれぞれ、入力チャンネル数と出力チャンネル数 
  • \(h_I\) と \(w_I\) はそれぞれ画像の高さと幅.
  • \(h_K\) と \(w_K\) はそれぞれフィルターの高さと幅
  • \(h_P\) と \(w_P\) はそれぞれ、空間的パディングサイズ 

 \((s_Y, s_X)\) をフィルター適用のストライド(適用間隔)とします。そして、出力サイズ \((h_O, w_O)\) は 下記の等式によって推定されます。

\[\begin{split}h_O &= s_Y (h_I - 1) + h_K - 2h_P,\\ w_O &= s_X (w_I - 1) + w_K - 2w_P.\end{split}\]

この関数の出力はcuDNNを使用する場合非決定論的になることがあります。chainer.configuration.config.deterministic が True 、かつ cuDNN version >= v3の場合は、cuDNN が決定的アルゴリズムを使用するように強制します。

Warning

deterministic 引数はv2以降サポートされていません。替わりに、chainer.using_config('cudnn_deterministic', value) (value は True もしくは False)をお使いください。 chainer.using_config()をご覧ください。

Parameters:
  • x (Variable or numpy.ndarray or cupy.ndarray) – shape が\((n, c_I, h_I, w_I)\)である入力値
  • W (Variable or numpy.ndarray or cupy.ndarray) – shapeが \((c_I, c_O, h_K, w_K)\)である荷重変数
  • b (Variable or numpy.ndarray or cupy.ndarray) –  長さ \(c_O\)のバイアス変数 (オプション).
  • stride (int or pair of int s) –フィルタ適用の範囲。ストライド。stride=sstride=(s, s) は等しい。 
  • pad (int or pair of int s) – 入力配列の空間的なパディング幅。pad=ppad=(p, p) は等しい。
  • outsize (tuple of int) – 予想されるdeconvolutionの処理の出力サイズ。. 高さと幅の組み合わせ \((h_O, w_O)\)になる。デフォルト値はNone 、出力サイズは入力サイズとstrideとpadから推定される。
Returns:

shapeが \((n, c_O, h_O, w_O)\)である出力値

Return type:

Variable

 

Example

 


>>> n = 10

>>> c_i, c_o = 1, 3
>>> h_i, w_i = 5, 10
>>> h_k, w_k = 10, 10
>>> h_p, w_p = 5, 5
>>> x = np.random.uniform(0, 1, (n, c_i, h_i, w_i)).astype('f')
>>> x.shape (10, 1, 5, 10)
>>> W = np.random.uniform(0, 1, (c_i, c_o, h_k, w_k)).astype('f')
>>> W.shape (1, 3, 10, 10)
>>> b = np.random.uniform(0, 1, c_o).astype('f')
>>> b.shape (3,)
>>> s_y, s_x = 5, 5
>>> y = F.deconvolution_2d(x, W, b, stride=(s_y, s_x), pad=(h_p, w_p))
>>> y.shape (10, 3, 20, 45)
>>> h_o = s_y * (h_i - 1) + h_k - 2 * h_p
>>> w_o = s_x * (w_i - 1) + w_k - 2 * w_p
>>> y.shape == (n, c_o, h_o, w_o) True