Keras极高的损失

8

我正在尝试通过特征预测价格。

我选择了一个相当简单的模型,但它的表现非常奇怪。损失函数非常高,我看不出问题出在哪里。

以下是我的模型:

# define base model
def baseline_model():
    # create model
    model = Sequential()
    model.add(Dense(62, input_dim = 62, kernel_initializer='normal', activation='relu'))
    model.add(Dense(31, kernel_initializer='normal', activation='relu'))
    model.add(Dense(15, kernel_initializer='normal', activation='relu'))
    model.add(Dense(1, kernel_initializer='normal'))
    # Compile model
    model.compile(loss='mean_squared_error', optimizer='adam')
    return model

这是我准备数据的方法:(使用One-Hot编码并将所有数据分为训练集和测试集)
df = encode_onehot(dataframe, cols=['Shape', 'Cut', 'Color', 'Clarity', 'Polish', 'Symmetry', 'Culet', '\tFluorescence'])

dataset = df.values
X = dataset[1:,4:66]
Y = dataset[1:,2]

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.25, random_state=42)

最后,培训:

baseline_model().fit(X_train, y_train, epochs=10, batch_size=64)
scores = baseline_model().evaluate(X_test, y_test, verbose=0)
print(baseline_model().summary())

结果非常令人沮丧:

Epoch 1/10
149767/149767 [==============================] - 4s - loss: 104759338.0333     
Epoch 2/10
149767/149767 [==============================] - 4s - loss: 104594236.9627     
Epoch 3/10
149767/149767 [==============================] - 4s - loss: 104556662.2948     

而且情况并没有变得更好。

我做错了什么?


你的输入和输出数据是什么样子的?X的值是作为不同的整数还是向量进行独热编码的?Y是否进行了独热编码?从问题中无法确定。 - gionni
3
“y_train”的取值范围是多少?其中是否包含大于10000的数值?如果“y_train”中存在一些较大的数值,由于您正在使用平均平方误差,因此看到高损失并不奇怪。除非您的模型非常强大或者您有非常强的特征,否则“y_true - y_pred”的平方可能会非常大。 - Yu-Yang
@gionni X的值被独热编码为向量。Y没有进行独热编码(因为它只是“价格”)。 - Stanislav Dobryakov
1
尝试更多的时代。您还可以尝试先对y值进行归一化处理(例如,将其范围归一化为(0,1)),然后再训练您的网络。 - Miriam Farber
2个回答

10

正如@Yu-Yang所说,您正在使用均方误差作为损失函数。我之前也遇到了同样的问题,当我将损失函数更改为mean_squared_logarithmic_error时,我得到了期望的结果。

model %>% compile(
optimizer = optimizer_rmsprop(lr=0.0001),
loss = loss_mean_squared_logarithmic_error,
metrics = c("accuracy")
)

损失值发生了改变

第1个纪元/共10个
326981/326981 [==============================] - 17秒 - 损失值: 0.0048 - 准确率: 0.9896

希望这对你有用!


4
嗨,我可能会理解错误,但是如果你从均方误差(MSE)切换到对数误差(log error),当然可以获得更低的值,但是你不应该比较这两个值,因为它们处于完全不同的范围。因此,如果您的模型在使用“平均平方对数误差”(mean squared logarithmic error)损失进行训练后产生了更少(或更小)的预测误差,那么这将是训练采用对数版本更好的一个很好的指标,但否则它只是表面上显示出更小的数字,这可能会让您感到更加平静。 - jottbe
我猜测日志版本主要存在是因为它与某些激活函数结合使用可以更容易地构建导数。 - jottbe

2
  1. 像预处理步骤一样对数据集进行归一化处理。
  2. 我看到您正在使用回归模型,因此使用回归模型时,您的损失将与如果您将模型用于分类时完全不同。
  3. 如果需要进行分类,请将损失函数设置为类似于categorical_crossentropy的函数。并在机器学习的最后一层设置激活函数。

此致敬礼!


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