为啥尽管损失衰减且评估结果合理,但张量流的“准确度”值始终为 0
Posted
技术标签:
【中文标题】为啥尽管损失衰减且评估结果合理,但张量流的“准确度”值始终为 0【英文标题】:Why is the tensorflow 'accuracy' value always 0 despite loss decaying and evaluation results being reasonable为什么尽管损失衰减且评估结果合理,但张量流的“准确度”值始终为 0 【发布时间】:2021-04-07 22:19:48 【问题描述】:我正在学习如何使用 Tensorflow,并按照其中一个示例构建了一个模型来执行方程 y=mx+c 的线性回归。我生成了一个包含 1999 个样本的 csv 文件和一个模型,我可以在其中更改规范化(开/关)、层数、节点数和 epoch 数。在我事先不知道答案但对我的结果感到困惑的情况下,我希望能够使用训练和评估的损失/准确性来指导这些变量的选择,总结如下
Normalization Layers Nodes Epochs Start Loss End Loss Accuracy
真 1 200 5 0.6022 0.4348 0
真 1 200 50 0.5963 0.4347 0
真 10 200 5 0.5249 0.4525 0
真 10 200 50 0.5157 0.4418 0
真 10 500 5 0.5816 0.4825 0
真 10 500 50 0.5591 0.4422 0
假 1 200 5 996.2897 1.8313 0
假 1 200 50 1063.1994 1.7264 0
假 10 200 5 421.1371 40.6160 0
假 10 200 50 293.6943 46.2854 0
假 10 500 5 382.2659 297.2881 0
假 10 500 50 412.2182 79.7649 0
我使用的编译参数是
编译优化器:adam loss:mean_absolute_error 指标:['accuracy'] loss_weights:[1.0]
一个示例模型摘要是
型号:“LRmodel”
图层(类型)输出形状参数#
LR-输入 (InputLayer) [(None, 1)] 0
密集(密集)(无,200)400
ML-LinearRegression (Dense) (None, 1) 201
总参数:601
可训练参数:601
不可训练的参数:0
示例拟合结果为
1600/1600 - 1s - 损失:1063.1994 - 准确度:0.0000e+00 - val_loss:90.2848 - val_accuracy:0.0000e+00
纪元 2/5
1600/1600 - 0s - 损失:137.8654 - 准确度:0.0000e+00 - val_loss:2.1525 - val_accuracy:0.0000e+00
3/5 纪元
1600/1600 - 0s - 损失:4.4340 - 准确度:0.0000e+00 - val_loss:3.4557 - val_accuracy:0.0000e+00
4/5 纪元
1600/1600 - 0s - 损失:1.7573 - 准确度:0.0000e+00 - val_loss:3.1190 - val_accuracy:0.0000e+00
5/5 纪元
1600/1600 - 0s - 损失:1.7264 - 准确度:0.0000e+00 - val_loss:3.2794 - val_accuracy:0.0000e+00
另外还有2个问题我不明白
-
有时拟合的高损失永远不会改变,模型无法计算结果。发生这种情况时,我会再次运行训练(有时多次)并最终获得上述结果,而无需更改数据或代码。
规范化生成的模型不如我不规范化模型时准确。
【问题讨论】:
我们在 SO 中已经评论过很多次了,准确率只是分类问题的指标,而不是回归的指标,所以在这种情况下使用它是没有意义的。 【参考方案1】:你没有展示你的模型。但是,如果您正在进行线性回归,则不应将准确性用作指标。当您进行分类时使用准确性,例如尝试对图像是狗还是猫进行分类。您应该在 model.compile 中使用适合线性回归的损失函数,例如 tf.keras.losses.MeanSquaredError。回归损失的文档是 here. 回归指标的文档是 here.
【讨论】:
以上是关于为啥尽管损失衰减且评估结果合理,但张量流的“准确度”值始终为 0的主要内容,如果未能解决你的问题,请参考以下文章