Создайте пользовательский слой свертки и сравните два слоя керас - PullRequest
2 голосов
/ 20 июня 2019

В настоящее время я создаю сеть в кератах для выполнения разделения гармонических / ударных источников на звуковой спектрограмме, используя метод медианной фильтрации (http://dafx10.iem.at/papers/DerryFitzGerald_DAFx10_P15.pdf).

С учетом входной амплитудной спектрограммы S и обозначения i -ого таймфрейма как S i и h срез частоты как S h , кадр спектрограммы с усилением перкуссии P i может быть сгенерирован путем выполнения медианной фильтрации S i : P i = M { S i , l perc } где M обозначает медианную фильтрацию, а l perc - длину фильтра. Затем отдельные кадры с усилением перкуссии P i затем объединяются для получения спектрограммы с усилением перкуссии P . Аналогично, частотный срез спектрограммы с усилением гармоник H h может быть получен путем медианного среза частоты фильтрации S h : H i = M { S ч , l вред }.

Если у вас есть P и H , вы можете увидеть, принадлежит ли каждый частотный интервал S h, i к гармонике или ударный источник: если Ч ч, i > П ч, i , S h, i переходит на гармоническую спектрограмму и принимает значение 0 в ударной спектрограмме, и наоборот.

В моей сети, учитывая входную спектрограмму и для определенного периода времени S i , мне нужно вычислить медианы по горизонтали для каждой частоты h. Это легко сделать с помощью лямбда-слоя и тензорного потока:

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

Здесь длина медианного фильтра гармоник l вред - горизонтальная длина входной спектрограммы. На выходе получается вектор, размер которого равен количеству частот (в моем случае 88).

На следующем шаге я застрял прямо сейчас: мне нужно вычислить медианы по вертикали для текущего временного интервала S i , учитывая длину ударного медианного фильтра l perc , и зная, что я хочу, чтобы результирующий вектор был такого же размера, что и вход, поэтому я должен быть осторожен на каждом конце ввода (размер фильтра будет между l вред и l вред / 2 в зависимости от того, где мы находимся). Это выглядит как своего рода свертка, из-за отсутствия лучшего слова.

Как только у меня появятся два результирующих вектора H i и P i , я хочу сравнить их и присвоить каждому значению исходная рамка S i для ударного слоя ( L p ) или гармонического слоя ( L ч ). Итак, у меня есть три разных входа: H i , P i и S i , и я хочу получить L p и L h , сравнив H i и P i и продолжайте строить мою сеть оттуда. Если H i, j > P i, j , то L p i, j = 0 и L ч i, j = S i, j .

Подводя итог, я застрял на двух разных проблемах:

  1. Как вычислить горизонтальные медианы?

  2. Как реализовать в сети операции, которые позволят мне перейти с H i , P i и S i до L p и L h ?

Заранее большое спасибо!

...