首页 > 解决方案 > 为什么这个神经网络的准确率为零,损失极低?

问题描述

我有网络:

Tensor("input_1:0", shape=(?, 5, 1), dtype=float32)
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 5, 1)              0         
_________________________________________________________________
bidirectional_1 (Bidirection (None, 5, 64)             2176      
_________________________________________________________________
activation_1 (Activation)    (None, 5, 64)             0         
_________________________________________________________________
bidirectional_2 (Bidirection (None, 5, 128)            16512     
_________________________________________________________________
activation_2 (Activation)    (None, 5, 128)            0         
_________________________________________________________________
bidirectional_3 (Bidirection (None, 1024)              656384    
_________________________________________________________________
activation_3 (Activation)    (None, 1024)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 1025      
_________________________________________________________________
p_re_lu_1 (PReLU)            (None, 1)                 1         
=================================================================
Total params: 676,098
Trainable params: 676,098
Non-trainable params: 0
_________________________________________________________________
None
Train on 27496 samples, validate on 6875 samples

我适合并编译它:

model.compile(loss='mse',optimizer=Adamx,metrics=['accuracy'])
model.fit(x_train,y_train,batch_size=100,epochs=10,validation_data=(x_test,y_test),verbose=2)

当我运行它并对看不见的数据进行评估时,它返回 0.0 准确度且损失非常低。我不知道有什么问题。

Epoch 10/10
 - 29s - loss: 1.6972e-04 - acc: 0.0000e+00 - val_loss: 1.7280e-04 - val_acc: 0.0000e+00

标签: pythontensorflowkerasdeep-learningrecurrent-neural-network

解决方案


你得到的是预期的。您的模型工作正常,是您的度量指标不正确。优化函数的目的是最小化损失,而不是提高准确性。

由于您使用 PRelu 作为最后一层的激活函数,因此您总是从网络获得浮点输出。将这些浮点输出与实际标签进行比较以衡量准确性似乎不是正确的选择。由于输出和标签是连续随机变量,特定值的联合概率为零。因此,即使模型预测的值非常接近真实标签值,模型准确度仍然为零,除非模型预测的值与真实标签完全相同——这是不可能的。

例如,如果 y_true 为 1.0 并且模型预测为 0.99999,则该值仍然不会增加模型的准确性,因为 1.0 != 0.99999

更新 指标函数的选择取决于问题的类型。Keras 还提供了实现自定义指标的功能。假设问题是线性回归,并且如果两个值之间的差异小于 0.01,则两个值相等,则自定义损失指标可以定义为:-

import keras.backend as K
import tensorflow as tf
accepted_diff = 0.01
def linear_regression_equality(y_true, y_pred):
    diff = K.abs(y_true-y_pred)
    return K.mean(K.cast(diff < accepted_diff, tf.float32))

现在您可以将此指标用于您的模型

model.compile(loss='mse',optimizer=Adamx,metrics=[linear_regression_equality])

推荐阅读