python - 为什么这个神经网络的准确率为零,损失极低?
问题描述
我有网络:
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
解决方案
你得到的是预期的。您的模型工作正常,是您的度量指标不正确。优化函数的目的是最小化损失,而不是提高准确性。
由于您使用 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])
推荐阅读
- webpack - webpack 崩溃扩展应用程序
- bash - 字符串与 Bash 中的输出比较
- javascript - 我希望在由“事件”触发时出现图像,而其他问题没有任何效果
- c# - HighCharts 仪表从 -100% 到 100%
- vba - 如何简化使用活动单元格/复制/粘贴在工作表之间传输数据?
- regex - regexprep 函数无法接受 \b 来查找数字范围
- sql - 如何编写查询以匹配记录组
- powerbi - 如何在 Power BI Desktop 中勾勒切片器的边框
- python - scrapy 从不同的函数将数据添加到 json 文件中
- kubernetes - 如何在 GCE 之上的自制 Kubernetes 集群上启用 Volume & LoadBalancer。