Я работаю над шумоподавляющим автоэнкодером для аудио, подаю в сеть необработанный звук временного ряда и получаю звук временного ряда в качестве выхода из сети.Целевая функция потерь 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))
Является ли тренировочное поведение следствием формы потери или, возможно, существует какая-то другая проблема с внутренней структуройфункция потерь?