构建LSTM模型时遇AttributeError: keras.src.backend无Variable属性求助
LSTM模型构建报错:AttributeError: module 'keras.src.backend' has no attribute 'Variable'
问题描述
原本计划尝试LGBM实现模型,实际编写了LSTM模型代码,修改Keras版本后出现以下错误:
AttributeError: module 'keras.src.backend' has no attribute 'Variable'
错误发生在添加LSTM层的步骤,完整报错栈如下:
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) Cell In[84], line 42 40 # LSTMモデルの構築 41 model = Sequential() ---> 42 model.add(LSTM(units=50, activation='relu', input_shape=(X_train.shape[1], X_train.shape[2]))) 43 model.add(Dense(units=1)) 44 model.compile(optimizer='adam', loss='mean_squared_error') File ~/work/bakueki/.venv/lib/python3.11/site-packages/keras/src/layers/rnn/lstm.py:460, in LSTM.__init__(self, units, activation, recurrent_activation, use_bias, kernel_initializer, recurrent_initializer, bias_initializer, unit_forget_bias, kernel_regularizer, recurrent_regularizer, bias_regularizer, activity_regularizer, kernel_constraint, recurrent_constraint, bias_constraint, dropout, recurrent_dropout, seed, return_sequences, return_state, go_backwards, stateful, unroll, **kwargs) 433 def __init__( 434 self, 435 units, (...) 458 **kwargs, 459 ): ---> 460 cell = LSTMCell( 461 units, 462 activation=activation, 463 recurrent_activation=recurrent_activation, 464 use_bias=use_bias, 465 kernel_initializer=kernel_initializer, 466 unit_forget_bias=unit_forget_bias, 467 recurrent_initializer=recurrent_initializer, 468 bias_initializer=bias_initializer, ... 73 trainable=False, 74 name="seed_generator_state", 75 ) AttributeError: module 'keras.src.backend' has no attribute 'Variable'
原代码如下:
import numpy as np import pandas as pd from keras.models import Sequential from keras.layers import LSTM, Dense from sklearn.model_selection import train_test_split from sklearn.preprocessing import MinMaxScaler import os os.environ["KERAS_BACKEND"] = "jax" import keras data = result target = data['close'].values features = data[['diff_log_close', 'diff_log_open', 'diff_log_high', 'diff_log_low']].values scaler = MinMaxScaler(feature_range=(0, 1)) features_scaled = scaler.fit_transform(features) target_scaled = scaler.fit_transform(target.reshape(-1, 1)) def create_dataset(X, y, time_steps=1): Xs, ys = [], [] for i in range(len(X) - time_steps): v = X[i:(i + time_steps)] Xs.append(v) ys.append(y[i + time_steps]) return np.array(Xs), np.array(ys) TIME_STEPS = 10 # Number of time steps to input to LSTM X, y = create_dataset(features_scaled, target_scaled, TIME_STEPS) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) model = Sequential() model.add(LSTM(units=50, activation='relu', input_shape=(X_train.shape[1], X_train.shape[2]))) model.add(Dense(units=1)) model.compile(optimizer='adam', loss='mean_squared_error') model.fit(X_train, y_train, epochs=100, batch_size=32, verbose=1, validation_data=(X_test, y_test)) y_pred = model.predict(X_test) y_pred_inv = scaler.inverse_transform(y_pred) y_test_inv = scaler.inverse_transform(y_test.reshape(-1, 1)) for i in range(len(y_pred_inv)): print(f"prediction: {y_pred_inv[i][0]}, value: {y_test_inv[i][0]}")
解决方案
1. 调整后端配置顺序(核心修复)
Keras后端环境变量必须在导入任何Keras模块之前设置,否则配置不会生效,导致后端API不兼容。原代码先导入了Keras模块再设置环境变量,这是错误的。
2. 确保版本兼容性
安装兼容版本的Keras和JAX:
pip install --upgrade keras jax jaxlib
3. 修改后的完整代码
import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import MinMaxScaler # 先设置Keras后端,必须在导入Keras模块之前执行 import os os.environ["KERAS_BACKEND"] = "jax" # 再导入Keras相关模块 from keras.models import Sequential from keras.layers import LSTM, Dense import keras data = result # 确保result是已定义的DataFrame target = data['close'].values features = data[['diff_log_close', 'diff_log_open', 'diff_log_high', 'diff_log_low']].values scaler = MinMaxScaler(feature_range=(0, 1)) features_scaled = scaler.fit_transform(features) target_scaled = scaler.fit_transform(target.reshape(-1, 1)) def create_dataset(X, y, time_steps=1): Xs, ys = [], [] for i in range(len(X) - time_steps): v = X[i:(i + time_steps)] Xs.append(v) ys.append(y[i + time_steps]) return np.array(Xs), np.array(ys) TIME_STEPS = 10 # 输入LSTM的时间步数量 X, y = create_dataset(features_scaled, target_scaled, TIME_STEPS) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) model = Sequential() model.add(LSTM(units=50, activation='relu', input_shape=(X_train.shape[1], X_train.shape[2]))) model.add(Dense(units=1)) model.compile(optimizer='adam', loss='mean_squared_error') model.fit(X_train, y_train, epochs=100, batch_size=32, verbose=1, validation_data=(X_test, y_test)) y_pred = model.predict(X_test) y_pred_inv = scaler.inverse_transform(y_pred) y_test_inv = scaler.inverse_transform(y_test.reshape(-1, 1)) for i in range(len(y_pred_inv)): print(f"prediction: {y_pred_inv[i][0]}, value: {y_test_inv[i][0]}")
备选方案:切换回TensorFlow后端
如果JAX后端仍有兼容性问题,可以直接去掉os.environ["KERAS_BACKEND"] = "jax"这一行,使用默认的TensorFlow后端,它对LSTM层的支持更成熟稳定。
内容的提问来源于stack exchange,提问作者Tombolo
相关产品推荐
相关产品推荐

