张量流中的负巨大损失

Negative huge loss in tensorflow

我正在尝试使用 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

This is my graph,就代码而言,它看起来像示例中的代码,但经过改编:

# 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')

我做错了什么? :(

编辑:我虽然教程中的编码器功能正在规范化数据,但事实并非如此。你们认识的人还有其他教程可以更好地指导我吗?丢失问题已修复! (归一化)

您似乎对模型的组件感到很困惑。

  1. 二元交叉熵是一个分类损失,你的问题是回归 -> 使用MSE。此外,“准确性”对于回归没有意义,也将其更改为 MSE。
  2. 你的数据庞大,你的损失很大。您的数据中有 113109.14 的价格,如果您的模型最初很糟糕并且显示为 0 怎么办?您损失了 ~100,000^2 = 10,000,000,000。 标准化你的数据,在你的例子中 - 输出变量(目标,价格)在 -1 和 1 之间
  3. 在某些一些用例中,输出神经元应该具有激活函数,但除非您知道为什么您要这样做,将其保留为线性是一个更安全的选择。
  4. Dropout 是一种正则化 模型的方法,不要开始,始终从最简单的模型开始,并且确保您可以 学习,然后再尝试最大化考试分数。
  5. 神经网络不会进行推断,以原始格式输入不断增长的信号(日期)几乎肯定会导致问题。