You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 01:54:52