本文的作者通过梯度下降(钟形曲线的 σ 参数)与神经网络的其他参数一起优化了高斯窗口大小。
我不使用高斯窗,而是使用汉恩窗。我想知道如何通过梯度下降使用 Hann/Hamming 窗口优化 stft 窗口大小?
问题在于,与高斯窗不同,汉恩窗没有连续参数 σ 作为梯度下降的代理。有没有一种方法可以重写 Hann 窗口,或者是否有可以用来控制窗口大小并且可以微分的参数?目前,是正整数,不可微分。
torch.hann_window 使用:
我挠了挠头,但不知道如何区分它。
非常感谢您的任何提示。
本文的作者通过梯度下降(钟形曲线的 σ 参数)与神经网络的其他参数一起优化了高斯窗口大小。
我不使用高斯窗,而是使用汉恩窗。我想知道如何通过梯度下降使用 Hann/Hamming 窗口优化 stft 窗口大小?
问题在于,与高斯窗不同,汉恩窗没有连续参数 σ 作为梯度下降的代理。有没有一种方法可以重写 Hann 窗口,或者是否有可以用来控制窗口大小并且可以微分的参数?目前,是正整数,不可微分。
torch.hann_window 使用:
我挠了挠头,但不知道如何区分它。
非常感谢您的任何提示。
最简单的方法是使用支持 autodiff 的运算符来获取 STFT,例如通过 PyTorch。然后只需将窗口设置为可更新参数,初始化为 Hanning 等:
import torch.nn as nn
from scipy.signal import windows
win = torch.from_numpy(windows.hann(128))
win_t = nn.Parameter(win, requires_grad=True)
然后我们会做例如
def forward(self, x):
x = STFT(x, win_t)
x = self.conv(x)
...
通过例如将窗口的权重定义为初始窗口的一半,但使用使用更新的权重的完整窗口进行操作,这可能有助于应用对称约束。
例如,请参阅这篇文章,将完全可微分 CWT 应用于反演。该网络可以嵌入到一个卷积网络中,如果我们用nn.Parameter.
如果目标是优化预定义窗口函数的参数,则通过可微参数生成窗口:
def gauss(N, sigma):
t = torch.linspace(-.5, .5, N)
return torch.exp(-(t / sigma)**2)
N = x.shape[-1]
sigma = nn.Parameter(torch.tensor(0.1))
win_t = gauss(N, sigma)
为了优化窗口的样本数量,我们必须确保采样是可微的。
arange(N) / N,但N必须是连续的,这需要四舍五入。torch.round不可微分,但torch.clamp可以。conv1d.假设我们从 开始,N=129最优是N_ref=160。结果:
Github上的代码。
考虑作为正实数并使用您的汉恩窗公式,. 那么偏导数关于将会:
在整数,有一个非常简单、稀疏的长度——离散傅里叶变换 (DFT)。非整数这种质量丢失了,但我也不知道您在我们的应用程序中是否需要这种质量。