我正在构建一个模型来执行方程y=mx+c
的线性回归。我生成了一个包含1999个样本的CSV文件和一个模型,其中我可以更改归一化(开/关)、层数、节点数和轮数。我期望能够使用训练和评估的损失/准确度来指导选择这些变量,但在不知道答案的情况下,我对目前的结果感到困惑,概括如下:
Normalization Layers Nodes Epochs Start Loss End Loss AccuracyTRUE 1 200 5 0.6022 0.4348 0TRUE 1 200 50 0.5963 0.4347 0TRUE 10 200 5 0.5249 0.4525 0TRUE 10 200 50 0.5157 0.4418 0TRUE 10 500 5 0.5816 0.4825 0TRUE 10 500 50 0.5591 0.4422 0FALSE 1 200 5 996.2897 1.8313 0FALSE 1 200 50 1063.1994 1.7264 0FALSE 10 200 5 421.1371 40.6160 0FALSE 10 200 50 293.6943 46.2854 0FALSE 10 500 5 382.2659 297.2881 0FALSE 10 500 50 412.2182 79.7649 0
我使用的编译参数是
compile optimizer:adam loss:mean_absolute_error metrics:['accuracy'] loss_weights:[1.0]
一个示例模型摘要是
Model: "LRmodel"_________________________________________________________________Layer (type) Output Shape Param #LR-input (InputLayer) [(None, 1)] 0 _________________________________________________________________dense (Dense) (None, 200) 400_________________________________________________________________ML-LinearRegression (Dense) (None, 1) 201Total params: 601Trainable params: 601Non-trainable params: 0
示例拟合结果是
1600/1600 - 1s - loss: 1063.1994 - accuracy: 0.0000e+00 - val_loss: 90.2848 - val_accuracy: 0.0000e+00Epoch 2/51600/1600 - 0s - loss: 137.8654 - accuracy: 0.0000e+00 - val_loss: 2.1525 - val_accuracy: 0.0000e+00Epoch 3/51600/1600 - 0s - loss: 4.4340 - accuracy: 0.0000e+00 - val_loss: 3.4557 - val_accuracy: 0.0000e+00Epoch 4/51600/1600 - 0s - loss: 1.7573 - accuracy: 0.0000e+00 - val_loss: 3.1190 - val_accuracy: 0.0000e+00Epoch 5/51600/1600 - 0s - loss: 1.7264 - accuracy: 0.0000e+00 - val_loss: 3.2794 - val_accuracy: 0.0000e+00
此外,还有两个我不理解的问题
- 有时拟合的损失值始终很高且不会改变,模型无法计算结果。当这种情况发生时,我会再次运行训练(有时多次),最终得到上述结果,而数据和代码没有任何变化。
- 归一化产生的模型不如不归一化的模型准确。
回答:
你没有展示你的模型。然而,如果你在做线性回归,你不应该使用准确度作为度量。准确度是用于分类任务的,比如试图分类一张图片是狗还是猫。你应该在model.compile
中使用适合线性回归的损失函数,如tf.keras.losses.MeanSquaredError
。回归损失的文档在这里。这里。回归度量的文档在这里。这里。