PyTorch的卷积和SciPy的卷积的不同结果

问题描述 投票:0回答:1

我正在建立一个PyTorch模型来估计Impuse Responses。目前,我正在根据实际和估计的脉冲响应来计算损失。我想将估计的和实际的脉冲响应与信号进行卷积,然后从中计算出损失。

pyroomaccoustics包使用SciPy的fftconvolve将脉冲响应与给定信号进行卷积。我不能使用它,因为它会破坏PyTorch的计算图。 PyTorch的conv1d使用互相关。从this answer看来,通过翻转滤镜conv1d可用于卷积。

我对以下代码为什么对conv1dconvolve给出不同的结果以及必须进行哪些更改才能使输出相等感到困惑。

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.  ]
python scipy pytorch signal-processing convolution
1个回答
1
投票

查看modescipy.signal.convolve参数。使用scipy.signal.convolve匹配PyTorch的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的默认行为相同的输出(即匹配scipy.signal.convolve),请将调用中的mode='full'设置为padding=2。更一般而言,对于给定的卷积内核conv1d,将填充设置为b

© www.soinside.com 2019 - 2024. All rights reserved.