【问题标题】:How to get Mean Absolute Errors (MAE) for deep learning model如何获得深度学习模型的平均绝对误差 (MAE)
【发布时间】:2021-11-13 08:24:36
【问题描述】:

我正在使用深度自动编码器模型开发推荐系统。如何定义mean absolute error(MAE)损失函数,并用它来计算模型准确率。

这是模型

model = deep_model(train_, layers, activation, last_activation, dropout, regularizer_encode, regularizer_decode)
model.compile(optimizer=Adam(lr=0.001), loss="mse", metrics=[  ] )
model.summary()

定义数据验证

data_valid =(train, validate)
hist_model = model.fit(x=train, y=train,
                  epochs=100,
                  batch_size=128,
                  validation_data= data_valid, verbose=2, shuffle=True)

【问题讨论】:

  • loss='mae' 不起作用?
  • 不,它不起作用。
  • 你说它不起作用是什么意思?如果操作正确,它确实有效。

标签: python keras deep-learning autoencoder


【解决方案1】:

你可以自己定义:

import keras.backend as K

def my_mae(y_true, y_pred):
    return K.mean(K.abs(y_pred - y_true), axis=-1) # -1 is correct, using None gives different result '''

然后这样做:

model.compile(optimizer=Adam(learning_rate=1e-2), loss=my_mae) 

但调用 keras 中实现的方法仍然是一个更好的主意,以这种方式:

model.compile(optimizer=Adam(learning_rate=1e-2), loss=tf.keras.losses.MeanAbsoluteError(name="mean_absolute_error")) 

【讨论】:

    【解决方案2】:

    我认为你可以使用 scikit-learn 函数 here。这将返回您的预测值。 我建议将模型拟合为:

    model.compile(optimizer=Adam(lr=0.001), loss="mae", metrics=[]) 
                               # instead of loss="mse"
    model_history = model.fit(
       X_train,   # instead of: x=train, y=train
       y_train,   # why x and y are the same as 'train'?
       epochs=100,
       batch_size=128,
       validation_data=(X_test,y_test))
    

    训练模型后,进行预测:

    predicton = model.predict(X_test)

    并通过以下方式获得 MAE:

    mae_error = mean_absolute_error(y_test, prediction)

    【讨论】:

    • 能否详细说明一下,谢谢! @BestDogeStackoverflow
    • 我也认为这是@Karamo 适合x=train, y=train 的问题,也许是loss="mae" 不能正常工作的原因?
    • @TrườngThuậnNguyễn x=train, y=train 不是问题所在。我正在使用自动编码器模型,其中输出是输入的重建。我确实在模型上使用了 RMSE 函数,结果是 `0.8010
    【解决方案3】:

    我使用 RMSE 来测量模型,结果很好。低于定义的 loss=masked_ms 和 metrics=[masked_rmse_clip] 函数

    对于损失函数

    def masked_mse(y_true, y_pred):
           # masked function
           mask_true = K.cast(K.not_equal(y_true, 0), K.floatx())
           # masked squared error
           masked_squared_error = K.square(mask_true * (y_true - y_pred))
           masked_mse = K.sum(masked_squared_error, axis=-1) / K.maximum(K.sum(mask_true, axis=-1), 1)
           return masked_mse
    
    

    指标

    
    
    def masked_rmse_clip(y_true, y_pred):
            # masked function
            mask_true = K.cast(K.not_equal(y_true, 0), K.floatx())
            y_pred = K.clip(y_pred, 1, 5)
            # masked squared error
            masked_squared_error = K.square(mask_true * (y_true - y_pred))
            masked_mse = K.sqrt(K.sum(masked_squared_error, axis=-1) / K.maximum(K.sum(mask_true, axis=-1), 1))
            return masked_mse
    
    
    

    模型

    model = deep_model(train, layers, activation, last_activation, dropout, regularizer_encode, regularizer_decode)
    model.compile(optimizer=Adam(lr=0.001), loss=masked_mse, metrics=[masked_rmse_clip] )
    model.summary()
    
    
    data_valid =(train, validate)
    
    
    
    hist_model = model.fit(x=train, y=train,
                      epochs=100,
                      batch_size=128,
                      validation_data= data_valid, verbose=2, shuffle=True)
    

    我在 100 个 epoch 后得到这个输出

    Epoch 100/100
    48/48 - 6s - loss: 0.9418 - masked_rmse_clip: 0.8024 - val_loss: 0.9853 - val_masked_rmse_clip: 0.8010
    
    

    我想要这样的东西给 MAE。所以我需要有关 MAE 的 lossmetrics 功能的帮助。

    【讨论】:

      猜你喜欢
      • 2019-07-10
      • 2018-12-18
      • 2021-12-30
      • 1970-01-01
      • 2021-01-18
      • 2019-05-14
      • 2019-04-25
      • 2019-05-01
      • 2018-10-27
      相关资源
      最近更新 更多