validation - Keras 验证损失和指标不一致

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

  • 用于回归的 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)]

然后设置一个简单的循环神经网络:

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)

然后输出看起来像这样:

Train on 3495 samples, validate on 1498 samples 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 Epoch 2/10 54/54 [==============================] - 2s 30ms/step - loss: 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 - loss: 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。这里有什么问题?

最佳答案

好的。我通过持续使用 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

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

关于validation - Keras 验证损失和指标不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66759184/

相关文章:

python - 为什么我在 Keras 中得到负的 false_negative 计数(例如 -10)?

keras - 在哪里实现层标准化?

machine-learning - 机器学习 (CNN/RNN) 的不平衡训练数据

keras - 对“了解Keras LSTM”的怀疑

javascript - 将 jQuery 验证应用于 SharePoint 可视化 Web 部件

java - Java 中用于验证用户名的正则表达式

javascript - 帮助 javascript 日期时间选择器验证

keras - 将initial_state 传递给Keras 中的双向RNN 层

java - 后台线程中的 Vaadin 表单验证?

tensorflow - tf.keras 中的 EarlyStopping 问题