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
です。
表記法: これは次元の表記法です。
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)\) は下記の式を満たさなければならない。
Parameters: |
|
---|---|
Returns: |
shapeが \((n, c_O, l_1, l_2, ..., l_N)\).である出力値 |
Return type: |
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