Keras Sequential气象预测模型输出与输入一致问题求助
问题:Sequential模型预测值与输入值完全一致
我们使用Keras Sequential模型构建气象变量预测模型,发现预测结果与输入值完全相同。尝试减少隐藏层数量、降低学习率、应用EarlyStopping回调后,问题仍未解决,求可行的解决办法。
相关代码
import numpy as np import tensorflow as tf import pandas as pd from keras.models import Sequential from keras.layers import Embedding, LSTM, GRU, Dense, Dropout from keras.models import load_model from keras.optimizers import Adam from keras.preprocessing import sequence from keras.callbacks import EarlyStopping from sklearn.model_selection import train_test_split from sklearn import preprocessing df1 = pd.DataFrame({'T' : df['기온(°C)'], 'WS' : df['풍속(m/s)'], 'RH' : df['습도(%)'], 'P' : df['해면기압(hPa)'], 'VS' : df['시정(10m)'], 'TD' : df['이슬점온도(°C)']}) # 注:原代码遗漏了模型初始化语句 wfm = Sequential() wfm.add(Dense(12, input_dim = 6, activation = 'tanh')) wfm.add(Dense(12, activation = 'tanh')) wfm.add(Dense(6, activation = 'relu')) wfm.add(Dense(6, activation = 'relu')) wfm.add(Dense(6, activation = 'relu')) wfm.add(Dense(6, activation = 'relu')) wfm.add(Dense(6, activation = 'relu')) wfm.add(Dense(6, activation = 'relu')) wfm.compile(loss = 'mean_squared_logarithmic_error', optimizer = tf.keras.optimizers.Adam(learning_rate = 0.001)) wfm.fit(x_train, y_train, epochs = 100, batch_size = 10, validation_data = (x_val, y_val)) def predict(data): result = wfm.predict(data) # 错误:对输入data做逆归一化,而非模型输出result result = scaler.inverse_transform(data) print("1小时后气象变量预测") print("기온 : ", result[0,0], "degreeC") print("풍속 : ", result[0,1], "m/s") print("습도 : ", result[0,2], "%") print("기압 : ", result[0,3], "hPa") print("시정 : ", result[0,4]*10, "m") print("이슬점 온도 : ", result[0,5], "degreeC") n = pd.DataFrame({'T' : [35.2], 'WS' : [0.8], 'RH' : [48], 'P' : [1004.3], 'VS' : [1963], 'TD' : [22.5]}) now = (n - df1.min())/(df1.max() - df1.min()) predict(now)
运行结果
1/1 [==============================] - 0s 129ms/step 1小时后气象变量预测 기온 : 35.2 degreeC 풍속 : 0.8 m/s 습도 : 48.0 % 기압 : 1004.3 hPa 시정 : 19629.999999999996 m 이슬점 온도 : 22.50000000000001 degreeC
注:df1已通过scikit-learn的MinMaxScaler进行归一化处理。
问题排查与解决办法
1. 修复预测函数的低级错误
预测函数中直接用输入数据data做逆归一化,完全覆盖了模型的预测结果,这是输出和输入一致的直接原因。修改如下:
def predict(data): result = wfm.predict(data) # 对模型输出的result做逆归一化,而非输入data result = scaler.inverse_transform(result) print("1小时后气象变量预测") print("기온 : ", result[0,0], "degreeC") print("풍속 : ", result[0,1], "m/s") print("습도 : ", result[0,2], "%") print("기압 : ", result[0,3], "hPa") print("시정 : ", result[0,4]*10, "m") print("이슬점 온도 : ", result[0,5], "degreeC")
2. 调整模型结构适配时序预测任务
气象预测是时序预测任务,当前全连接Dense层无法捕捉时间依赖,容易学到恒等映射:
- 补充模型初始化语句:原代码遗漏
wfm = Sequential(),需添加 - 替换为LSTM/GRU层:将输入整理为
(样本数, 时间步长, 特征数)格式(比如用过去6小时数据预测1小时后),再用循环神经网络建模,示例结构:
wfm = Sequential() # 输入shape为(时间步长, 特征数),这里假设用过去6小时的6个特征 wfm.add(LSTM(32, input_shape=(6, 6), return_sequences=False)) wfm.add(Dropout(0.2)) wfm.add(Dense(6, activation='linear')) # 回归任务用linear激活更合适
- 简化冗余层:原模型堆叠6个Dense(6)层,参数冗余易导致无效学习,建议大幅简化结构
3. 验证数据与训练设置
- 确认标签正确性:
y_train必须是1小时后的气象数据,若和x_train相同,模型自然会学恒等映射 - 归一化一致性:确保
scaler仅拟合训练集,再用同一scaler处理验证集、测试集,避免数据分布不一致 - 更换损失函数:回归任务优先使用
mse(均方误差),mean_squared_logarithmic_error更适合右偏分布数据,气象变量不一定适配
4. 添加训练监控
用EarlyStopping监控验证集损失,避免过拟合并保留最优权重:
early_stopping = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True) wfm.fit(x_train, y_train, epochs=100, batch_size=10, validation_data=(x_val, y_val), callbacks=[early_stopping], verbose=1)
内容的提问来源于stack exchange,提问作者gwnu_numerical
相关产品推荐
相关产品推荐

