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

构建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 22:46:09