Python の畳み込み関数についての簡単な説明

この記事ではPythonの畳み込みについての理解を中心に紹介しており、詳細なコード例も掲載されており、参考になると思います。

畳み込み関数

pythonさまざまな畳み込みスキームが提供されていますが、対照的に、で定義されたndimage畳み込み関数は、 innumpyおよびinsignalの畳み込みよりもわずかに複雑です。これは入力パラメータの数からのみわかります。

1

2

3

4

5

numpy.convolve(a, v, mode='full')

scipy.ndimage.convolve1d(input, weights, axis=-1, output=None, mode='reflect', cval=0.0, origin=0)

scipy.signal.convolve(in1, in2, mode='full', method='auto')

scipy.ndimage.convolve(input, weights, output=None, mode='reflect', cval=0.0, origin=0)

最初の 2 つは 1 次元の畳み込み関数で、 ndimage は単一の座標軸に沿って多次元配列に対して畳み込み演算を実行でき、後の 2 つは多次元の畳み込みです。

numpy と signal の畳み込み関数には 3 つのモードがあり、畳み込み後のエッジ特性を調整するために使用されます。2 つの入力畳み込みオブジェクトの次元が N NN と M MM の場合、これら 3 つのモードの出力は次のようになります。

  • full: 出力次元は N + M − 1 N+M-1N+M−1 で、最終点の信号は全く重ならないため、エッジ効果が明らかです。
  • same: 出力寸法 max ⁡ ( M , N ) \max(M,N)max(M,N)、エッジ効果はまだ表示されます
  • valid: 出力次元 ∣ M − N ∣ |MN|∣M−N∣ は、完全に重複する領域のみを返します。これは、エッジ効果のあるすべての点を削除するのと同じです。

 ndimageエッジ効果の場合convolve、画像は拡張され、mode拡張後の塗りつぶし形式が決定されます。フィルタリングされる配列が の場合a b c d、さまざまなモードでは、エッジは次のように塗りつぶされます。

左パディング データ 右パディング
reflect dcba あいうえお dcba
constant クック あいうえお クック
nearest ああああ あいうえお ああ
mirror DCB あいうえお CBA
wrap あいうえお あいうえお あいうえお

このうち、kパラメータを通じて設定されますcval

境界を変更するこれら 5 つの方法は、scipy.ndimage関数、特に標準の畳み込みを伴うフィルター関数で非常に一般的です。

比較テスト

次に、これらのさまざまな畳み込み関数についてパフォーマンス テストを実行し、5 × 5 畳み込みテンプレートを使用して 1000 × 1000 行列で畳み込み計算を実行し、さまざまな実装の畳み込み速度を確認します。

1

2

3

4

5

6

7

8

9

10

11

12

13

import numpy as np

import scipy.signal as ss

import scipy.ndimage as sn

from timeit import timeit

A = np.random.rand(1000,1000)

B = np.random.rand(5,5)

timeit(lambda : ss.convolve(A, B), number=10)

# 0.418

timeit(lambda : sn.convolve(A, B), number=10)

# 0.126

比較すると、ndimageの畳み込みは明らかに効率的です。

接下来测试一下一维卷积的表现

1

2

3

4

5

6

7

8

9

10

11

A = np.random.rand(10000)

B = np.random.rand(15)

timeit(lambda : np.convolve(A, B), number=1000)

# 0.15256029999727616

timeit(lambda : ss.convolve(A, B), number=1000)

# 0.1231262000001152

timeit(lambda : sn.convolve(A, B), number=1000)

# 0.09218210000108229

timeit(lambda : sn.convolve1d(A, B), number=1000)

# 0.03915820000111125

相比之下,convolve1d不愧是写明了1d的卷积函数,速度最快,而numpy中提供的函数速度最慢。

转自:微点阅读   https://www.weidianyuedu.com

おすすめ

転載: blog.csdn.net/weixin_45707610/article/details/131787999