首页 > 解决方案 > 创建自定义卷积层并比较两个 keras 层

问题描述

我目前正在 keras 中创建一个网络,以使用中值滤波技术(http://dafx10.iem.at/papers/DerryFitzGerald_DAFx10_P15.pdf)对音频频谱图执行谐波/打击源分离。

给定输入幅度谱图S,并将第i个时间帧表示为S i,将第h个频率切片表示为S h ,可以通过对S i执行中值滤波来生成打击乐增强谱图帧P iP i = M{ S i , l perc } 其中M表示中值滤波,l perc是滤波器长度。单独的打击乐增强帧P i然后组合以产生打击乐增强的频谱图P类似地,通过中值滤波频率切片S h可以得到谐波增强频谱图频率切片H hH i = M{ S h , lharm }。

一旦你有了PH,你可以看到每个频率箱S h,i是属于谐波还是冲击源:如果H h,i > P h,i , S h,i进入谐波谱图并取冲击谱图中的值 0,反之亦然。

在我的网络中,给定输入频谱图和特定时间帧Si ,需要计算每个频率 h 的水平中位数。这可以通过 lambda 层和 tensorflow 轻松完成:

layer_H = Lambda(lambda x:tf.contrib.distributions.percentile(x[0], 50, axis=0))(layer)

这里,谐波中值滤波器的长度lharm是输入频谱图的水平长度。输出是一个向量,其大小等于频率数(在我的例子中为 88)。

下一步是我现在卡住的地方:我需要垂直计算当前时间帧S i的中值,给定冲击中值滤波器l perc的长度,并且知道我希望得到的向量大小相同作为输入,所以我必须小心输入的每一端(过滤器的大小将在l伤害l伤害/2 之间,具体取决于我们所处的位置)。这看起来像是某种卷积,因为没有更好的词。

一旦我得到两个结果向量H iP i,我想比较它们并将原始帧S i的每个值分配给打击层(L p)或谐波层(L h)。所以,我有三个不同的输入,H iP iS i,我想通过比较H iP i得到L pL h,并从那里继续构建我的网络。如果H i,j> P i,j,然后L p i,j = 0 和L h i,j = S i,j

总而言之,我遇到了两个不同的问题:

  1. 如何计算水平中位数?

  2. 如何在网络中实现允许我从H iP iS iL pL h的操作?

非常感谢您提前!

标签: pythontensorflowkerasneural-networkcompare

解决方案


推荐阅读