【发布时间】: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