chainer.functions.convolution_2d(x, W, b=None, stride=1, pad=0, cover_all=False)[source]

2次元畳み込み関数。

 

この関数はConvNetsの2次元畳み込みの実装です。3つの変数をとり、入力画像 x、フィルター荷重 W, そしてバイアスベクトル bです。

 

表記法:これは、次元についての表記法です。

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

 Convolution2D 関数は、フィルタ とxにおける  \((h_K, w_K)\) サイズのパッチの相関性を計算します。

 

ここで相関性とは、拡張されたベクトル間の内積に等しいことに注意してください。パッチは、各空間軸の最初の位置 (-h_P, -w_P) からstride (適用間隔)の倍数ぶん、シフトされた位置で抽出されます。

一番右側(もしくは一番下)のパッチはパッディングされた空間サイズを超えては適用されません。

 

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

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

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

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

バイアス・ベクトルが与えられた場合、全ての畳込みの出力の空間的位置にそれが加えられます。 

この関数の出力は cuDNNを使用する場合、非決定論的である可能性があります。もし chainer.configuration.config.cudnn_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_O, c_I, h_K, w_K)\)の荷重変数。
  • b (Variable or numpy.ndarray or cupy.ndarray) – 長さ \(c_O\) のバイアス値。(オプション)。
  • stride (int or pair of int s) – フィルタ適用のストライド(適用間隔)。 stride=s と stride=(s, s) は等しい。
  • pad (int or pair of int s) – 入力配列への空間的なパッディング幅  pad=ppad=(p, p) は等しい。
  • cover_all (bool) – True,が設定されている場合、全ての空間的位置はいくつかの出力ピクセルへ畳み込まれる。
Returns:

shapeが \((n, c_O, h_O, w_O)\)の出力値

Return type:

Variable

See also

Convolution2D

 

Example

 



>>> n = 10
>>> c_i, c_o = 3, 1
>>> h_i, w_i = 30, 40
>>> 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, 3, 30, 40)
>>> W = np.random.uniform(0, 1, (c_o, c_i, h_k, w_k)).astype('f')
>>> W.shape
(1, 3, 10, 10)
>>> b = np.random.uniform(0, 1, (c_o,)).astype('f')
>>> b.shape (1,)
>>> s_y, s_x = 5, 7
>>> y = F.convolution_2d(x, W, b, stride=(s_y, s_x), pad=(h_p, w_p))
>>> y.shape
(10, 1, 7, 6)
>>> h_o = int((h_i + 2 * h_p - h_k) / s_y + 1)
>>> w_o = int((w_i + 2 * w_p - w_k) / s_x + 1)
>>> y.shape == (n, c_o, h_o, w_o)
True
>>> y = F.convolution_2d(x, W, b, stride=(s_y, s_x), pad=(h_p, w_p), cover_all=True)
>>> y.shape == (n, c_o, h_o, w_o + 1)
True