pytorch 如何重新组合相同大小的音频块的预测类的概率来预测音频文件的类?

dm7nw8vv  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(105)

我想用PyTorch为音频数据(昆虫的声音)创建一个分类器。由于算法要求所有输入的大小相同,因此我将每个文件分成大小相等的块,然后进行训练和验证。在进行预测时,算法将预测每个块的概率,但我需要对每个文件进行预测。如何将1到n行的块概率聚合为文件的概率?
我曾试图通过计算平均数来进行汇总,但结果很差。对于只有几个块包含信号且大多数块仅包含背景噪声的文件尤其如此。“
我也试过预先从噪声中提取信号,但在大多数情况下,这些都不能清楚地分开。
是否有一种最先进的方法可以根据文件的块预测来对文件进行良好的预测?

t1rydlwq

t1rydlwq1#

假设您有:

chunk1 = torch.tensor([0, 0, 1, 0, 0], dtype=torch.float)
chunk2 = torch.ones(5) / 5
chunk3 = torch.tensor([0.5, 0.5, 0, 0, 0])
stacked = torch.stack( (chunk1, chunk2, chunk3) )
stacked
tensor([[0.0000, 0.0000, 1.0000, 0.0000, 0.0000],
    [0.2000, 0.2000, 0.2000, 0.2000, 0.2000],
    [0.5000, 0.5000, 0.0000, 0.0000, 0.0000]])

字符串
有许多方法可以将这些结合起来。
如果我理解正确的话,我认为您正在寻找的是一种合并它们的方法,该方法对chunk2(因为它包含的有用信息最少)进行了减权,并对chunk1(似乎是最确定的)进行了增权。
对于最终结果,您希望它们的总和为1.0。这对于mean来说很好用,但是如果你做其他的事情,你要么用div乘以sum,要么用softmax。Softmax可以将任意模型输出为“logits”(对数概率),因此您可以在将其传递给softmax之前调整值并将其求和。
mean给了你一个相当无差别的:

In [33]: stacked.mean(dim=0)
Out[33]: tensor([0.2333, 0.2333, 0.4000, 0.0667, 0.0667])


你可以这样做:

In [45]: stacked.mul(5).sum(dim=0).softmax(dim=0)
Out[45]: tensor([0.0697, 0.0697, 0.8492, 0.0057, 0.0057])


或者也可以使用softmax的“temperature”,它实际上只是在调用softmax之前应用的div因子。下面,T=0.5似乎有所帮助:

In [50]: stacked.sum(dim=0).softmax(dim=0)
Out[50]: tensor([0.2057, 0.2057, 0.3391, 0.1248, 0.1248])
In [51]: stacked.sum(dim=0).div(2).softmax(dim=0)
Out[51]: tensor([0.2065, 0.2065, 0.2652, 0.1609, 0.1609])
In [52]: stacked.sum(dim=0).div(0.5).softmax(dim=0)
Out[52]: tensor([0.1834, 0.1834, 0.4984, 0.0675, 0.0675])

相关问题