Разные результаты из конвоя PyTorch и конвоя SciPy - PullRequest
0 голосов
/ 24 февраля 2020

Я строю модель PyTorch для оценки Ответов Impuse . В настоящее время я рассчитываю потери от реального и предполагаемого импульсного отклика. Я хотел бы свести воедино как предполагаемый, так и реальный импульсный отклик с сигналом, а затем рассчитать потери по ним.

В пакете pyroomaccoustics используется SciPy's fftconvolve для свертывания импульсного отклика с данным сигналом. Я не могу использовать это, так как это нарушит график вычислений PyTorch. PyTorch conv1d использует взаимную корреляцию. Из этого ответа кажется, что, перевернув фильтр, можно использовать conv1d для свертки.

Я запутался, почему следующий код дает другой результат для conv1d и convolve и что нужно изменить, чтобы получить равные выходы.

import torch
from scipy.signal import convolve

a = torch.tensor([.1, .2, .3, .4, .5])
b = torch.tensor([.0, .1, .0])

a1 = a.view(1, 1, -1)
b1 = torch.flip(b, (0,)).view(1, 1, -1)


print(torch.nn.functional.conv1d(a1, b1).view(-1))
# >>> tensor([0.0200, 0.0300, 0.0400])

print(convolve(a, b))
# >>> [0.   0.01 0.02 0.03 0.04 0.05 0.  ]

1 Ответ

1 голос
/ 24 февраля 2020

Посмотрите на параметр mode scipy.signal.convolve. Используйте mode='valid', чтобы соответствовать conv1d PyTorch:

In [20]: from scipy.signal import convolve                                      

In [21]: a = np.array([.1, .2, .3, .4, .5])                                     

In [22]: b = np.array([.0, .1, .0])                                             

In [23]: convolve(a, b, mode='valid')                                           
Out[23]: array([0.02, 0.03, 0.04])

Чтобы изменить вызов conv1d PyTorch, чтобы дать тот же вывод, что и поведение по умолчанию scipy.signal.convolve (то есть, чтобы соответствовать mode='full') для этого примера установите padding=2 в вызове на conv1d. В более общем случае для данного ядра свертки b установите заполнение на len(b) - 1.

...