PyTorch 的 conv1d 和 SciPy 的卷积的不同结果
Different results from PyTorch's conv1d and SciPy's convolve
我正在构建一个 PyTorch 模型来估计 Impuse Responses。
目前我正在计算真实和估计的脉冲响应的损失。
我想将估计的和实际的脉冲响应与信号进行卷积,然后计算它们的损失。
pyroomaccoustics package uses SciPy's fftconvolve
to convolve the impulse response with a given signal. I cannot use this since it would break PyTorch's computation graph. PyTorch's conv1d
uses cross-correlation. From 好像可以通过翻转过滤器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. ]
看看scipy.signal.convolve
的mode
参数。使用 mode='valid'
来匹配 PyTorch 的 conv1d
:
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])
要修改 PyTorch 的 conv1d
调用以提供与 scipy.signal.convolve
默认行为相同的输出(即匹配 mode='full'
),请设置 padding=2
在对 conv1d
的调用中。更一般地,对于给定的卷积核 b
,将填充设置为 len(b) - 1
.
完整、相同、在卷积中有效的附加示例图片
https://www.twblogs.net/a/5c8373f9bd9eee35fc13cb76
select [valid] 将匹配 torch.conv1d
我正在构建一个 PyTorch 模型来估计 Impuse Responses。 目前我正在计算真实和估计的脉冲响应的损失。 我想将估计的和实际的脉冲响应与信号进行卷积,然后计算它们的损失。
pyroomaccoustics package uses SciPy's fftconvolve
to convolve the impulse response with a given signal. I cannot use this since it would break PyTorch's computation graph. PyTorch's conv1d
uses cross-correlation. From 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. ]
看看scipy.signal.convolve
的mode
参数。使用 mode='valid'
来匹配 PyTorch 的 conv1d
:
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])
要修改 PyTorch 的 conv1d
调用以提供与 scipy.signal.convolve
默认行为相同的输出(即匹配 mode='full'
),请设置 padding=2
在对 conv1d
的调用中。更一般地,对于给定的卷积核 b
,将填充设置为 len(b) - 1
.
完整、相同、在卷积中有效的附加示例图片 https://www.twblogs.net/a/5c8373f9bd9eee35fc13cb76
select [valid] 将匹配 torch.conv1d