chainer.functions.
convolution_nd
(x, W, b=None, stride=1,
pad=0, cover_all=False)[source]¶
N次元畳み込み関数。
これは、N次元畳み込みの実装で、which is generalized two-dimensional convolution in ConvNetsにおける2次元畳み込みを一般化したものです。この関数は3つの変数(variable)をとります。すなわち、入力 x
, フィルター荷重 W
、そして バイアスベクトル b
です。
表記法:これは次元に関する表記法です。
convolution_nd
関数はフィルタと x
におけるサイズ \((k_1, k_2,
..., k_N)\) のフィルタとパッチの相関関係を演算します。ここでいう相関関係とは、拡張されたテンソル間の内積と同じものであることに留意してください。パッチは各空間軸の最初の位置である (-p_1, -p_2, ..., -p_N)
から、 stride
(←で指定された適用間隔)の倍数分シフトした位置から抽出されます。
\((s_1, s_2, ..., s_N)\)をフィルタ適用の適用間隔とします。そして、出力サイズ \((l_1, l_2, ..., l_N)\) は、下記の等式によって定義されます。
cover_all
オプションに True
が設定されている場合、
フィルタは全ての空間的位置をカバーします。ですから、最後のフィルターのストライドが空間的位置の末端をカバーしていない場合、負荷的なストライドが空間的位置の末端部分に適用されます。この場合、出力サイズは下記の等式で定義されます。
.N次元畳み込み関数は下記のように定義されています。
Parameters: |
|
---|---|
Returns: |
shapeが \((n, c_O, l_1, l_2, ..., l_N)\)である出力値。 |
Return type: |
この関数は下記の全ての条件が満たされている場合、順方向と逆方向の演算のためのcuDNN実装を用います
cuda.cudnn_enabled
が True
chainer.config.use_cudnn
が 'always'
もしくは 'auto'
cover_all
が False
dtype
がフィルター荷重のdtypeと同じ
dtype
が FP16、FP32 もしくは FP64。(FP16 はcuDNN version \(\geq\) v3の場合のみ有効。)
Example
>>> n = 10
>>> c_i, c_o = 3, 1
>>> d1, d2, d3 = 30, 40, 50
>>> 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, 30, 40, 50)
>>> W = np.random.uniform(0, 1, (c_o, c_i, k1, k2, k3)).astype('f')
>>> W.shape
(1, 3, 10, 10, 10)
>>> b = np.random.uniform(0, 1, (c_o)).astype('f')
>>> b.shape
(1,)
>>> s1, s2, s3 = 2, 4, 6
>>> y = F.convolution_nd(x, W, b, stride=(s1, s2, s3), pad=(p1, p2, p3))
>>> y.shape
(10, 1, 16, 11, 9)
>>> l1 = int((d1 + 2 * p1 - k1) / s1 + 1)
>>> l2 = int((d2 + 2 * p2 - k2) / s2 + 1)
>>> l3 = int((d3 + 2 * p3 - k3) / s3 + 1)
>>> y.shape == (n, c_o, l1, l2, l3)
True
>>> y = F.convolution_nd(x, W, b, stride=(s1, s2, s3), pad=(p1, p2, p3), cover_all=True)
>>> y.shape == (n, c_o, l1, l2, l3 + 1)
True