Краткое обсуждение функции свертки Python

Эта статья в основном знакомит с пониманием свертки в Python. В статье приведены подробные примеры кода, которые имеют хорошую справочную ценность. Надеюсь, она будет полезна всем.

функция свертки

pythonПредусмотрено множество схем свертки. Напротив, функция свертки, определенная в, немного сложнее, чем свертка ndimageв numpyи в функции. Это видно только по количеству входных параметров.signal

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)

Первые две — это одномерные функции свертки, и ndimage может выполнять операции свертки над многомерными массивами вдоль одной оси координат, а последние две — это многомерные свертки.

Функция свертки в numpy и signal имеет три режима, которые используются для настройки характеристик края после свертки.Если размеры двух входных объектов свертки равны NNN и MMM, выходные данные этих трех режимов.Результат:

  • 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 abcd dcba
constant хкккк abcd хкккк
nearest аааа abcd дддд
mirror dcb abcd ЦБА
wrap abcd abcd abcd

Среди них он задается kчерез параметры cval.

Эти пять методов изменения границ 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