TensorFlow中的巨大负损失

5
我正在尝试使用Keras从数据集中预测价格值。我正在按照这个教程https://keras.io/examples/structured_data/structured_data_classification_from_scratch/进行操作,但当我到达模型拟合部分时,我得到了一个巨大的负损失和非常小的准确率。
Epoch 1/50
1607/1607 [==============================] - ETA: 0s - loss: -117944.7500 - accuracy: 3.8897e-05
2022-05-22 11:14:28.922065: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.
1607/1607 [==============================] - 15s 10ms/step - loss: -117944.7500 - accuracy: 3.8897e-05 - val_loss: -123246.0547 - val_accuracy: 7.7791e-05
Epoch 2/50
1607/1607 [==============================] - 15s 9ms/step - loss: -117944.7734 - accuracy: 3.8897e-05 - val_loss: -123246.0547 - val_accuracy: 7.7791e-05
Epoch 3/50
1607/1607 [==============================] - 15s 10ms/step - loss: -117939.4844 - accuracy: 3.8897e-05 - val_loss: -123245.9922 - val_accuracy: 7.7791e-05
Epoch 4/50
1607/1607 [==============================] - 16s 10ms/step - loss: -117944.0859 - accuracy: 3.8897e-05 - val_loss: -123245.9844 - val_accuracy: 7.7791e-05
Epoch 5/50
1607/1607 [==============================] - 15s 10ms/step - loss: -117944.7422 - accuracy: 3.8897e-05 - val_loss: -123246.0547 - val_accuracy: 7.7791e-05
Epoch 6/50
1607/1607 [==============================] - 15s 10ms/step - loss: -117944.8203 - accuracy: 3.8897e-05 - val_loss: -123245.9766 - val_accuracy: 7.7791e-05
Epoch 7/50
1607/1607 [==============================] - 15s 10ms/step - loss: -117944.8047 - accuracy: 3.8897e-05 - val_loss: -123246.0234 - val_accuracy: 7.7791e-05
Epoch 8/50
1607/1607 [==============================] - 15s 10ms/step - loss: -117944.7578 - accuracy: 3.8897e-05 - val_loss: -123245.9766 - val_accuracy: 7.7791e-05
Epoch 9/50

这是我的图表, 就代码而言,它看起来像例子中的那个,但经过了改编:

# Categorical feature encoded as string
desc = keras.Input(shape=(1,), name="desc", dtype="string")

# Numerical features
date = keras.Input(shape=(1,), name="date")
quant = keras.Input(shape=(1,), name="quant")

all_inputs = [
    desc,
    quant,
    date,
]

# String categorical features
desc_encoded = encode_categorical_feature(desc, "desc", train_ds)

# Numerical features
quant_encoded = encode_numerical_feature(quant, "quant", train_ds)
date_encoded = encode_numerical_feature(date, "date", train_ds)

all_features = layers.concatenate(
    [
        desc_encoded,
        quant_encoded,
        date_encoded,
    ]
)
x = layers.Dense(32, activation="sigmoid")(all_features)
x = layers.Dropout(0.5)(x)
output = layers.Dense(1, activation="relu")(x)
model = keras.Model(all_inputs, output)
model.compile("adam", "binary_crossentropy", metrics=["accuracy"])

数据集如下所示:

date    desc    quant   price
0   20140101.0  CARBONATO DE DIMETILO   999.00  1428.57
1   20140101.0  HIDROQUINONA    137.00  1314.82
2   20140101.0  1,5 PENTANODIOL TECN.   495.00  2811.60
3   20140101.0  SOSA CAUSTICA LIQUIDA 50%   567160.61   113109.14
4   20140101.0  BOROHIDRURO SODICO  6.24    299.27

我正在将日期从YYYY-MM-DD转换为数字,使用以下代码:

dataset['date'] = pd.to_datetime(dataset["date"]).dt.strftime("%Y%m%d").astype('float64')

我做错了什么?:(
编辑:我认为教程中的编码器函数正在规范化数据,但实际上并不是。你们知道其他更好的教程吗?损失问题已解决!(由于标准化导致)

一个可能的问题是您的激活函数顺序错误。输出层上的ReLU会导致所有小于0的输出被固定为0。因此,很多输出都被分类为0。尝试交换两个激活函数 - ReLU <=> Sigmoid。 - Sean
@Pau,你的损失函数与最后一层激活函数不匹配。要么将binary_crossentropy更改为类似于mse的东西,要么将最后一层的relu更改为sigmoid - Kaveh
1
大家好,感谢您们的快速回复。我按照你们说的做了,将代码更改为以下形式: x = layers.Dense(32, activation="sigmoid")(all_features) x = layers.Dropout(0.5)(x) output = layers.Dense(1, activation="sigmoid")(x) model = keras.Model(all_inputs, output) model.compile("adam", "mse", metrics=["accuracy"])但是我仍然得到了巨大的损失值(现在是正值),例如: loss: 928364544.0000 - accuracy: 7.7979e-05如果我使用binary_crossentropy,则会得到负值。 - Pau
1个回答

3

您似乎对模型的组成部分感到相当困惑。

  1. 二元交叉熵是一种分类损失,而您的问题是回归问题 -> 使用均方误差(MSE)。此外,“准确性”对于回归没有意义,也要将其更改为MSE。
  2. 您的数据量巨大,因此您的损失也很大。在数据中,价格为113109.14,如果您的模型最初预测为0,会发生什么?您将得到一个损失约为 100,000^2 = 10,000,000,000。 归一化您的数据,在您的情况下要归一化输出变量(目标价格)至介于-1和1之间
  3. 一些用例需要输出神经元具有激活函数,但除非您知道为什么这样做,否则将其保留为线性函数是一个更安全的选择。
  4. Dropout是一种正则化模型的方法,请不要一开始就使用它,始终从最简单的模型入手,并确保您可以学习后再尝试最大化测试得分。
  5. 神经网络无法外推,在原始格式中输入一个不断增长的信号(日期)几乎肯定会引起问题。

谢谢回答!数据已经被规范化了,这就是为什么我感到惊讶的原因(我复制的是日期更改后的原始数据集)。至于其他方面,非常感谢!我会考虑到这些。 - Pau
我以为教程中的编码器函数正在规范化数据,但实际上并不是。你们知道有哪些其他教程可以更好地指导我吗?损失问题已经解决了!(由于规范化引起的) - Pau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接