我正在学习信号卷积,我有点混淆 Pytorch 函数 conv1d 和 scipy 卷积之间的区别。我确信的是 pytorch conv1d 实际上是在计算互相关,而 scipy 将执行传统的卷积。我可以手动翻转内核以从互相关匹配到卷积。
例如,现在我有一个长度为 120(120 个计时点)的 1D 内核和一个长度为 149(149 个计时点)的信号 Sob。我知道 Sob 来自一些名为 Strue conv 的内核信号(长度 120)。我的最终目标是获得 Sture。
假设我随机猜测 Sture,长度应该是多少?如果我想保持Strue与Sobs的长度相同,那么卷积结果(Strue * kernel)将变成149 + 120 - 1 = 268(我想使用完整模式)而不是Sobs = 149。我该怎么办在这里?
如果我想使用 pytorch 编写代码(我想通过完全连接的神经网络获得初始 Strue 猜测)。如果我想使用 pytorch 函数 conv1d 计算 conv,网络将给我一个随机 Sture [size, 1],因为它是一维信号。我的小批量是什么?应该是149还是1? pytorch 函数 conv1d 仅具有有效且相同的模式。如何调整填充以匹配 Scipy 中的完整模式?
[BATCH_SIZE, 1, size]
形状(假设你的信号只包含 1 个通道),并且 pytorch 功能 conv1d
实际上支持数字填充(应该填充两侧),这样你可以输入 kernel_size - 1
(在您的情况下为 119
)作为填充参数来模仿全模式卷积。BATCH_SIZE
应该独立于您的数据,因为这意味着它们是单独的数据点,堆叠在一起以便彼此并行计算。这是一个例子:
x = torch.rand(1,1,149)
kernel = torch.rand(1,1,120) #<- [out_channels, in_channels, kernel_size]
torch.nn.functional.conv1d(x, kernel, padding= 119).shape
>>> torch.Size([1, 1, 268])