пользовательская скалярная функция потерь в кератах для сквозного прогнозирования временных рядов, приводящего к потере NaN и прогнозам - PullRequest
0 голосов
/ 26 февраля 2019

Я работаю над шумоподавляющим автоэнкодером для аудио, подаю в сеть необработанный звук временного ряда и получаю звук временного ряда в качестве выхода из сети.Целевая функция потерь mean_square_error возвращает значения формы (batch_size, audio_sequence_length), которые (надеюсь, я правильно понял) дополнительно обрабатываются Keras для внутреннего получения окончательных однозначных потерь, используемых для backprop, путем вычисления средних по времени бинов и пакетов.

В настоящее время мои усилия направлены на создание пользовательской функции потерь с использованием мощности сигнала вместо ошибки отдельных выборок, возвращая значения формы (batch_size, ).Модель хорошо компилируется, но возвращает только потерю NaN во время тренировки.Попытка предсказать что-либо с помощью такой модели приводит также к выходным векторам, состоящим из NaN.

Это функция потерь:

def SI_SNR(yTrue,yPred):
     yTarget = K.batch_dot(yTrue,yPred,axes=0)      
     yTarget = K.batch_dot(yTrue,yTarget,axes=None)
     yNorm = K.batch_dot(yTrue,yTrue, axes = 0)
     yTarget = yTarget/yNorm
     eNoise = yPred - yTarget
     losses = -(10.*K.log(K.batch_dot(yTarget,yTarget,axes=0)/
               K.batch_dot(eNoise,eNoise,axes=0))/K.log(10.))
     return K.reshape(losses,([-1]))

При использовании функции для фактических чисел (либо с использованиемподмножество обучающих данных или случайно заполненных массивов) Я получаю результаты, не относящиеся к NaN:

x=K.variable(np.random.rand(8,1024,1))
y=K.variable(np.random.rand(8,1024,1))
K.eval(SI_SNR(y,x))

Является ли тренировочное поведение следствием формы потери или, возможно, существует какая-то другая проблема с внутренней структуройфункция потерь?

1 Ответ

0 голосов
/ 27 февраля 2019

Чтобы ответить на мой собственный вопрос: форма вывода стоимости не была проблемой.Протестировал эту гипотезу, используя другую (фиктивную) потерю:

def meanMSE(yTrue,yPred):
     return K.mean(mean_squared_error(yTrue,yPred),axis=1)

Если yPred - вектор нулей, у предыдущей функции стоимости есть проблемы с Div0, с использованием backend.clip и незначительным изменением функции, проблемарешено:

def SDR(yTrue,yPred):
     return(K.batch_dot(yPred,yPred,axes=1)/
             K.clip(K.square(K.batch_dot(yPred,yTrue,axes=1)),1e-7,1e12))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...