使用 Pytorch 进行一维信号卷积

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

我正在学习信号卷积,我有点混淆 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 中的完整模式?

python pytorch conv-neural-network signal-processing convolution
1个回答
0
投票
  1. Strue 的长度应该由您的问题预定义,因为它应该是真实数据。所以你应该再次检查你的问题。
  2. 对于 pytorch 上的一维卷积,你的数据应该是
    [BATCH_SIZE, 1, size]
    形状(假设你的信号只包含 1 个通道),并且 pytorch 功能
    conv1d
    实际上支持数字填充(应该填充两侧),这样你可以输入
    kernel_size - 1
    (在您的情况下为
    119
    )作为填充参数来模仿全模式卷积。
  3. 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])
© www.soinside.com 2019 - 2024. All rights reserved.