【问题标题】:Keras validation loss and metric inconsistentKeras 验证损失和指标不一致
【发布时间】:2021-03-23 07:55:06
【问题描述】:
  • 用于回归的 RNN 模型,参见Chollet,使用 Python 进行深度学习,6.3.1 温度预测问题
  • 在此示例中,我使用了随机数据,包括回归量和回归量
  • 我已将平均绝对误差用作损失函数和指标
  • 我不明白我得到的 val_loss 和 val_mean_absolute_error 的值。它们对我来说都没有意义。

代码:

import tensorflow as tf
import numpy as np
from keras.models import Sequential
from keras import layers
from keras.optimizers import Adam
import keras

我使用随机输入数据:

data_np = np.random.rand(6400,10)
target_np = np.random.rand(6400,)

标准化数据:

mean1 = data_np[:].mean(axis=0)
std1 = data_np[:].std(axis=0)  
    
data_np -= mean1
data_np /= std1
        
mean2 = target_np.mean(axis=0)
std2 = target_np.std(axis=0)
        
target_np -= mean2
target_np /= std2

创建带有回溯的 RNN 输入:

lookback = 7

train_data = np.array([data_np[(i-lookback):i,:] for i in range(lookback,len(data_np))])
target_data = target_np[lookback:len(data_np)]

然后建立一个简单的RNN:

model = Sequential()
model.add(layers.SimpleRNN(64,
                     activation = 'relu',
                     return_sequences=False,
                     input_shape=(train_data.shape[1], train_data.shape[2])))
model.add(layers.Dense(1))

opt = Adam(learning_rate=0.1)

mae = tensorflow.keras.losses.MeanAbsoluteError()

model.compile(optimizer=opt, loss=mae, metrics=[mae])
history = model.fit(train_data, target_data,
                              steps_per_epoch=round(0.7*len(train_data))//64,
                              epochs=10,
                              shuffle=False,
                              validation_split=0.3,
                              validation_steps = round(0.3*len(train_data))//64,
                              verbose=1)

然后输出如下所示:

训练 3495 个样本,验证 1498 个样本 Epoch 1/10 54/54 [==============================] - 2s 38ms/step - loss: 0.7955 - mean_absolute_error:0.7955 - val_loss:0.0428 - val_mean_absolute_error:22.6301 纪元 2/10 54/54 [==============================] - 2s 30ms/步 - 损失:0.7152 - mean_absolute_error:0.7152 - val_loss:0.0421 - val_mean_absolute_error: 22.2968

我希望 val_loss 和 val_mean_absolute_error 相同。此外,这些级别也没有多大意义。 10个纪元后,我得到了

Epoch 10/10 54/54 [==============================] - 2s 32ms/step - 损失:0.7747 - mean_absolute_error:0.7747 - val_loss:0.0409 - val_mean_absolute_error: 21.6337

如果我手动计算平均绝对误差:

N=len(data_np)

val_data = np.array([data_np[(i-lookback):i,:] for i in range(round(0.7*N),N)])
val_target = target_np[round(0.7*N):N]

model_output = model.predict(val_data)

model_output=[output[0] for output in model_output]
np.mean(abs(model_output-val_target))

0.940300949276649

这看起来是可以预期的结果。但是,它甚至不接近 val_loss 或 val_mean_absolute_error。这里有什么问题?

【问题讨论】:

    标签: validation keras recurrent-neural-network metrics loss-function


    【解决方案1】:

    好的。我设法通过始终使用 tensorflow.keras 解决了这个问题。所以,替换

    import tensorflow as tf
    import numpy as np
    from keras.models import Sequential
    from keras import layers
    from keras.optimizers import Adam
    import keras
    

    import tensorflow as tf
    import numpy as np
    from tensorflow.keras.models import Sequential
    from tensorflow.keras import layers
    from tensorflow.keras.optimizers import Adam
    import tensorflow.keras
    

    (并更正了原始问题中的一些细节)

    【讨论】:

      猜你喜欢
      • 2018-07-08
      • 2019-04-02
      • 1970-01-01
      • 2020-05-21
      • 2018-12-17
      • 2017-01-10
      • 2017-08-10
      • 2017-07-17
      • 2020-01-12
      相关资源
      最近更新 更多