【发布时间】:2020-06-08 03:59:00
【问题描述】:
我正在构建一个 PyTorch 模型来估计 Impuse Responses。 目前我正在计算真实和估计脉冲响应的损失。 我想将估计的和实际的脉冲响应与信号进行卷积,然后计算这些损失。
pyroomaccoustics 包使用 SciPy 的 fftconvolve 将脉冲响应与给定信号进行卷积。我不能使用它,因为它会破坏 PyTorch 的计算图。 PyTorch 的 conv1d 使用互相关。从this answer看来,通过翻转过滤器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. ]
【问题讨论】:
标签: python scipy pytorch signal-processing convolution