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です。

 

表記法:これは次元に関する表記法です。

  • \(N\) は空間的次元数。
  • \(n\)はバッチサイズ。
  • \(c_I\) と \(c_O\) はそれぞれ、入力チャンネル数と出力チャンネル数。
  • \(d_1, d_2, ..., d_N\) はそれぞれ、入力の空間的次元の各軸のサイズ。
  • \(k_1, k_2, ..., k_N\) はそれぞれ、フィルターの各軸のサイズ。 
  • \(l_1, l_2, ..., l_N\) はそれぞれ、出力の空間的次元の各軸のサイズ。
  • \(p_1, p_2, ..., p_N\) はそれぞれ、空間的パッディングサイズの各軸のサイズ。 t

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)\) は、下記の等式によって定義されます。

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

cover_all オプションに Trueが設定されている場合、 フィルタは全ての空間的位置をカバーします。ですから、最後のフィルターのストライドが空間的位置の末端をカバーしていない場合、負荷的なストライドが空間的位置の末端部分に適用されます。この場合、出力サイズは下記の等式で定義されます。

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

.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_O, c_I, k_1, k_2, ..., k_N)\) である荷重変数。
  • b (Variable or numpy.ndarray or cupy.ndarray) – 長さが \(c_O\) である一次元バイアス変数。(オプション).
  • 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)と等しい。
  • cover_all (bool) – True,が設定されている場合、全ての空間的位置は幾つかの出力ピクセルへ畳み込まれます。 このことで出力サイズが大きくなることがあります。cuDNNを使いたい場合は、 cover_allFalse を設定する必要があります。
Returns:

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

Return type:

Variable

Note

この関数は下記の全ての条件が満たされている場合、順方向と逆方向の演算のためのcuDNN実装を用います

  • cuda.cudnn_enabled が True
  • chainer.config.use_cudnn が 'always' もしくは 'auto'
  • 空間的次元数が1以上。
  • cover_all が False
  • 入力の dtype がフィルター荷重のdtypeと同じ
  • dtype が FP16、FP32 もしくは FP64。(FP16 はcuDNN version \(\geq\) v3の場合のみ有効。)
See also

ConvolutionND, convolution_2d()

 

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