我正在尝试在 TensorFlow 中使用 Keras 构建和训练有状态 LSTM 模型,但在指定 batch_input_shape 参数时不断遇到 ValueError。
错误消息:
ValueError: Unrecognized keyword arguments passed to LSTM: {'batch_input_shape': (1, 1, 14)}
这是我的代码的简化版本:
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM
# Load your data
file_path = 'path_to_your_file.csv'
data = pd.read_csv(file_path)
# Create 'date' column with the first day of each month
data['date'] = pd.to_datetime(data['tahun'].astype(str) + '-' + data['bulan'].astype(str) + '-01')
data['date'] = data['date'] + pd.offsets.MonthEnd(0)
data.set_index('date', inplace=True)
# Group by 'date' and sum the 'amaun_rm' column
df_sales = data.groupby('date')['amaun_rm'].sum().reset_index()
# Create a new dataframe to model the difference
df_diff = df_sales.copy()
df_diff['prev_amaun_rm'] = df_diff['amaun_rm'].shift(1)
df_diff = df_diff.dropna()
df_diff['diff'] = df_diff['amaun_rm'] - df_diff['prev_amaun_rm']
# Create new dataframe from transformation from time series to supervised
df_supervised = df_diff.drop(['prev_amaun_rm'], axis=1)
for inc in range(1, 13):
field_name = 'lag_' + str(inc)
df_supervised[field_name] = df_supervised['diff'].shift(inc)
# Adding moving averages
df_supervised['ma_3'] = df_supervised['amaun_rm'].rolling(window=3).mean().shift(1)
df_supervised['ma_6'] = df_supervised['amaun_rm'].rolling(window=6).mean().shift(1)
df_supervised['ma_12'] = df_supervised['amaun_rm'].rolling(window=12).mean().shift(1)
df_supervised = df_supervised.dropna().reset_index(drop=True)
df_supervised = df_supervised.fillna(df_supervised.mean())
# Split the data into train and test sets
train_set, test_set = df_supervised[0:-6].values, df_supervised[-6:].values
scaler = MinMaxScaler(feature_range=(-1, 1))
scaler = scaler.fit(train_set)
train_set_scaled = scaler.transform(train_set)
test_set_scaled = scaler.transform(test_set)
# Split into input and output
X_train, y_train = train_set_scaled[:, 1:], train_set_scaled[:, 0]
X_test, y_test = test_set_scaled[:, 1:], test_set_scaled[:, 0]
X_train = X_train.reshape((X_train.shape[0], 1, X_train.shape[1]))
X_test = X_test.reshape((X_test.shape[0], 1, X_test.shape[1]))
# Check the shape of X_train
print("X_train shape:", X_train.shape) # Should output (44, 1, 14)
# Define the LSTM model
model = Sequential()
model.add(LSTM(4, stateful=True, batch_input_shape=(1, X_train.shape[1], X_train.shape[2])))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
# Train the model
model.fit(X_train, y_train, epochs=100, batch_size=1, verbose=1, shuffle=False)
# Summarize the model
model.summary()
我尝试过的:
-
我验证了
X_train
的形状,即(44, 1, 14)
-
我尝试使用
input_shape
而不是batch_input_shape
,这导致了不同的错误。 - 我确保TensorFlow 和 Keras 的版本是兼容的。
系统信息:
-
Python 版本:3.12
-
TensorFlow 版本:2.17.0
-
Keras 版本:3.4.1
问题:
如何我在 Keras 中正确指定
batch_input_shape
为我的有状态 LSTM 模型以避免此错误?是否有任何特定的版本要求或需要额外的配置?
在 Keras 的 LSTM 层中,
batch_input_shape
参数应该只在第一层中使用,而且当
stateful=True
时是
必须的
。 这个参数帮助有状态 LSTM 理解输入数据的批次大小、时间步长和特征维度。
在你的代码中,你正确地使用了
batch_input_shape
,但是错误信息表明 LSTM 层无法识别这个参数。这通常发生在
Keras 版本不兼容
的时候。 虽然你的 TensorFlow 版本 (2.17.0) 比较新,但你的 Keras 版本 (3.4.1) 比较旧,可能不支持这个参数在有状态 LSTM 中的用法。
为了解决这个问题,我建议你尝试以下两种方案:
方案 1:升级 Keras
将 Keras 升级到最新版本可能可以解决这个问题,因为新版本通常包含对旧版本的错误修复和对新特性的支持。 你可以使用 pip 命令来升级 Keras:
pip install --upgrade keras
方案 2:使用 TensorFlow 中的 Keras
从 TensorFlow 2.0 开始,Keras 已经整合到 TensorFlow 中,你可以直接使用
tensorflow.keras
模块来构建模型。 由于你已经在使用 TensorFlow 2.17.0, 尝试将代码中的
keras
替换为
tensorflow.keras
:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM
如果你已经尝试过升级 Keras 并且仍然遇到问题,请确保你的代码中没有其他地方使用了旧版本的 Keras。 另外,请检查你的环境中是否安装了多个版本的 Keras,并确保你正在使用的是你期望的版本。
如果问题仍然存在,请提供以下信息以便我进一步帮助你:
- 升级 Keras 后的完整错误信息
- 你的操作系统和环境信息(例如,你是使用虚拟环境吗?)
- 你是如何安装 TensorFlow 和 Keras 的?