python - 创建自定义卷积层并比较两个 keras 层
问题描述
我目前正在 keras 中创建一个网络,以使用中值滤波技术(http://dafx10.iem.at/papers/DerryFitzGerald_DAFx10_P15.pdf)对音频频谱图执行谐波/打击源分离。
给定输入幅度谱图S,并将第i个时间帧表示为S i,将第h个频率切片表示为S h ,可以通过对S i执行中值滤波来生成打击乐增强谱图帧P i:P i = M{ S i , l perc } 其中M表示中值滤波,l perc是滤波器长度。单独的打击乐增强帧P i然后组合以产生打击乐增强的频谱图P。类似地,通过中值滤波频率切片S h可以得到谐波增强频谱图频率切片H h:H i = M{ S h , lharm }。
一旦你有了P和H,你可以看到每个频率箱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 i和P i,我想比较它们并将原始帧S i的每个值分配给打击层(L p)或谐波层(L h)。所以,我有三个不同的输入,H i、P i和S i,我想通过比较H i和P i得到L p和L h,并从那里继续构建我的网络。如果H i,j> P i,j,然后L p i,j = 0 和L h i,j = S i,j。
总而言之,我遇到了两个不同的问题:
如何计算水平中位数?
如何在网络中实现允许我从H i、P i和S i到L p和L h的操作?
非常感谢您提前!
解决方案
推荐阅读
- python - 带有简单 MNIST 数据示例的深度学习错误
- c# - 当我将 .NET Standard 2.0 DLL 库与 .NET Framework 控制台应用程序一起使用时,如何设置依赖项?
- python - 我希望在 gui 中输入的值更改 gui 运行的代码脚本中的值
- sql - 当我能以更简单的方式加入两个专栏时,我为什么要加入?
- javascript - 测试异步 useEffect
- image - 将图像序列保存为 Tiff 文件,但无法在 Matlab 之外查看或打开它
- c# - 如何在 c# 中使用 HttpClient GetAsync 方法传递请求内容
- php - 我的测试功能中的问题试图访问路由组
- javascript - setState 在这种情况下如何不起作用?
- algorithm - 对具有线性复杂性的嵌套循环感到困惑(Big-Oh = O(n)),但我将其工作为对数