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

N次元のl deconvolution 関数。

 

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

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

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

  • \(N\) 空間的な次元数
  • \(n\) はバッチサイズ
  • \(c_I\) と \(c_O\) はそれぞれ、入力チャンネル数と出力チャンネル数。
  • \(d_1, d_2, ..., d_N\)はそれぞれ、入力の空間的次元の各軸のサイズ。
  • \(k_1, k_2, ..., k_N\)はそれぞれ、フィルターの各軸のサイズ。 
  • \(p_1, p_2, ..., p_N\)はそれぞれ、空間的パディングサイズの各軸のサイズ。
  • \(s_1, s_2, ..., s_N\) はそれぞれ、フィルタ適用の各軸のストライド(適用間隔9

outsize オプションが  None,の場合、出力サイズ \((l_1, l_2, ..., l_N)\) は下記の式に上記のリストのアイテムを用いて決定される。

\[l_n = s_n (d_n - 1) + k_n - 2 p_n \ \ (n = 1, ..., N)\]

outsize オプションが与えられるとき、出力サイズは outsizeによって決定される。この場合、outsize \((l_1, l_2, ..., l_N)\) は下記の式を満たさなければならない。

\[d_n = \lfloor (l_n + 2p_n - k_n) / s_n \rfloor + 1 \ \ (n = 1, ..., N)\]
Parameters:
  • x (Variable or numpy.ndarray or cupy.ndarray) – shapeが \((n, c_I, d_1, d_2, ..., d_N)\)である入力値
  • W (Variable or numpy.ndarray or cupy.ndarray) –shapeが \((c_I, c_O, k_1, k_2, ..., k_N)\)である荷重変数。
  • b (Variable or numpy.ndarray or cupy.ndarray) – 長さが \(c_O\) の1次元バイアス変数(オプション).
  • stride (int or tuple of int s) – フィルター適用間隔 \((s_1, s_2, ..., s_N)\)。stride=s(s, s, ..., s)に等しい。
  • pad (int or tuple of int s) – 入力配列 \((p_1, p_2, ..., p_N)\)の空間的なパディング幅。. pad=p は (p, p, ..., p)に等しい。
  • outsize (tuple of int s) – 予想されるdeconvolutionの処理の出力サイズ。整数のタプル\((l_1, l_2, ..., l_N)\)でなければならない。デフォルト値はNone で、出力サイズは入力サイズとstrideとpadから推定される。
Returns:

shapeが \((n, c_O, l_1, l_2, ..., l_N)\).である出力値

Return type:

Variable

See also

links.DeconvolutionND, deconvolution_2d()

 

Example

 

Example1:  outsize が与えられていない場合。

>>> n = 10

>>> c_i, c_o = 3, 1
>>> d1, d2, d3 = 5, 10, 15
>>> k1, k2, k3 = 10, 10, 10
>>> p1, p2, p3 = 5, 5, 5
>>> x = np.random.uniform(0, 1, (n, c_i, d1, d2, d3)).astype('f')
>>> x.shape (10, 3, 5, 10, 15)
>>> W = np.random.uniform(0, 1, (c_i, c_o, k1, k2, k3)).astype('f')
>>> W.shape (3, 1, 10, 10, 10)
>>> b = np.random.uniform(0, 1, (c_o)).astype('f')
>>> b.shape (1,)
>>> s1, s2, s3 = 2, 4, 6
>>> y = F.deconvolution_nd(x, W, b, stride=(s1, s2, s3), pad=(p1, p2, p3))
>>> y.shape (10, 1, 8, 36, 84)
>>> l1 = s1 * (d1 - 1) + k1 - 2 * p1
>>> l2 = s2 * (d2 - 1) + k2 - 2 * p2
>>> l3 = s3 * (d3 - 1) + k3 - 2 * p3
>>> y.shape == (n, c_o, l1, l2, l3)
True

 

Example2:  outsize が与えられている場合。



>>> n = 10
>>> c_i, c_o = 3, 1
>>> d1, d2, d3 = 5, 10, 15
>>> k1, k2, k3 = 10, 10, 10
>>> p1, p2, p3 = 5, 5, 5
>>> x = np.random.uniform(0, 1, (n, c_i, d1, d2, d3)).astype('f')
>>> x.shape (10, 3, 5, 10, 15)
>>> W = np.random.uniform(0, 1, (c_i, c_o, k1, k2, k3)).astype('f')
>>> W.shape (3, 1, 10, 10, 10)
>>> b = np.random.uniform(0, 1, (c_o)).astype('f')
>>> b.shape (1,)
>>> s1, s2, s3 = 2, 4, 6
>>> l1, l2, l3 = 9, 38, 87
>>> d1 == int((l1 + 2 * p1 - k1) / s1) + 1 True
>>> d2 == int((l2 + 2 * p2 - k2) / s2) + 1 True
>>> d3 == int((l3 + 2 * p3 - k3) / s3) + 1 True
>>> y = F.deconvolution_nd(x, W, b, stride=(s1, s2, s3), pad=(p1, p2, p3), outsize=(l1, l2, l3))
>>> y.shape (10, 1, 9, 38, 87)
>>> y.shape == (n, c_o, l1, l2, l3)
True