keras 中用于端到端时间序列预测的标量自定义损失函数导致 NaN 损失和预测

scalar custom loss function in keras for end-to-end time series prediction resulting in NaN loss and predictions

我正在研究音频的降噪自动编码器,将原始时间序列音频提供给网络并接收时间序列音频作为网络输出。 mean_square_error 损失 objective 函数 returns 形状 (batch_size, audio_sequence_length) 的值,(我希望我理解正确)由 Keras 内部进一步处理以达到最终使用的单值损失通过计算时间段和批次的平均值来进行反向传播。

我目前的工作重点是使用信号功率而不是单个样本的误差创建自定义损失函数,返回形状值 (batch_size, )。该模型编译得很好,但 returns 在训练时只有 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))

训练行为是由于损失的形状还是损失函数的内部结构可能存在其他问题?

回答我自己的问题:成本的输出形状不是问题。使用不同的(虚拟)损失测试了这个假设:

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))