我正在使用DNN解决语音去噪问题。我通过下面的函数计算信噪比。
def calculate_snr(clean_signal, recovered_signal):
clean_power = tf.reduce_sum(tf.square(clean_signal))
noise_power = tf.reduce_sum(tf.square(clean_signal - recovered_signal))
snr_db = 10 * tf.math.log(clean_power / noise_power) / tf.math.log(10.0)
return snr_db
我正在使用keras API来创建这样的模型
model.compile(loss='mean_squared_error', optimizer=keras.optimizers.Adam(learning_rate=learning_rate),metrics=[calculate_snr])
sound_denoising_history = model.fit(x = X_abs.T, y = S_abs.T,epochs=200,batch_size = 100,validation_data=(X_test_01_abs.T,S_test_01_abs.T))
calculate_snr (X_test_01_abs.T,model.predict(X_test_01_abs.T) : 10.9
While model fit: -4.4 to -3
当我训练它时,我看到用于验证的SNR指标为-7,并在该范围内振荡。而如果我预测xval输入,然后用上面的函数,它给我8.2。这是相同的功能,我已经检查了尺寸多次。我不知道发生了什么事?
编辑:我知道我错过了一个处理信号计算的步骤,但即使指标是独立使用的,它也应该在列车端产生几乎相同的近似值,然后进行推理,然后进行计算
1条答案
按热度按时间q1qsirdb1#
当您在
model.compile
中使用calculate_snr
作为度量时,它会在训练期间分批应用,然后对这些分批值进行平均以计算最终度量。这可能会导致计算的SNR与在代码结束时进行预测后在整个数据集上手动计算时的SNR存在差异。您可以通过将
snr_metric
定义为类来克服此限制。然后你可以修改你的代码来进行训练和测试,如下所示: