validation - Keras 验证损失和指标不一致
问题描述
- 用于回归的 RNN 模型,参见 Chollet,使用 Python 进行深度学习,6.3.1 温度预测问题
- 在这个例子中,我使用了随机数据,regressors 和 regressand
- 我使用平均绝对误差作为损失函数和度量
- 我不明白我得到的 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/步 - 损失:0.7955 - mean_absolute_error:0.7955 - val_loss:0.0428 - val_mean_absolute_error:22.6301 Epoch 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个纪元后,我得到
时代 10/10 54/54 [==============================] - 2s 32ms/步 - 损失: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
(并更正了原始问题中的一些细节)
推荐阅读
- r - 重塑文件:更少的行 - 更多的列
- sql - 如果在 order by 语句下重复,则选择第一个元素
- python - python随机检查
- python - 在 Python 中将字符串添加到列表中
- postgresql - 从 postgresql DB 中选择多条记录并使用 WSO2ESB 插入到另一个表中
- websocket - 如何将 mpsc Receiver 分配给线程?
- swagger - OAS3:为什么在响应中定义 Accept 标头?
- apache-spark - 在 IntelliJ 上运行的异常 Spark sql 代码,即 java.lang.IllegalArgumentException:
- python - 如何递归地在python中查找目录
- c - C管道来自父进程的错误值