使用Tensorflow/Keras构建LSTM-DQN时批量大小不兼容问题求助
解决LSTM-DQN训练时的形状不匹配警告
我来帮你梳理这个问题的根源和解决办法,这个警告其实是批次大小不匹配导致的,和隐藏层/输出层无关,具体细节如下:
问题根源
你在定义第一个LSTM层时用了batch_input_shape=(64, 1, 10),这相当于强制模型要求每个输入批次必须包含64个样本。但调用model.fit(state, target)时,你没有显式指定batch_size参数,Keras会使用默认的批次大小32——它会自动把你提供的64个样本拆分成两个32样本的批次喂给模型,这就和模型定义的期望批次形状冲突了,所以触发了这个警告。
另外要注意:stateful=False的LSTM完全不需要固定批次大小,batch_input_shape一般只在**有状态LSTM(stateful=True)**场景下使用,用来维持批次间的状态连续性。你的DQN场景用无状态LSTM就足够,没必要固定批次。
解决方案
有两种可行的解决方式,推荐第二种更灵活的方案适配DQN的训练需求:
方案1:显式指定训练批次大小
保持模型定义不变,在fit时加上batch_size=batch_size参数,让Keras直接使用你定义的64样本批次,不做拆分:
# 修改fit调用行 model.fit(state, target, batch_size=batch_size, epochs=1, verbose=1)
方案2:改用input_shape定义输入(推荐)
去掉batch_input_shape,改用input_shape=(timesteps, input_length),这样模型可以接受任意批次大小的输入,非常适合DQN后续的经验回放(经验回放池采样的批次大小可能调整):
import numpy as np from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Flatten, Dense, Dropout, LSTM from tensorflow.keras.optimizers import Adam # Hyperparameters action_space = range(0, 10) input_length = 10 batch_size = 64 timesteps = 1 learning_rate = 0.0001 # Create random input variables state = np.random.randint(0, 100, size=(batch_size, timesteps, input_length)) target = np.random.randint(0, 100, size=(batch_size, len(action_space))) # Build the model - 使用input_shape代替batch_input_shape model = Sequential() model.add(LSTM(10, input_shape=(timesteps, input_length), return_sequences=True, activation="tanh", recurrent_dropout=0, stateful=False)) model.add(LSTM(10, activation="tanh", return_sequences=True, recurrent_dropout=0, stateful=False)) model.add(Flatten()) model.add(Dense(len(action_space), activation="relu")) model.compile(loss="mean_squared_error", optimizer=Adam(lr=learning_rate)) # Fit the model - 可灵活指定或不指定batch_size model.fit(state, target, epochs=1, verbose=1)
验证修改效果
修改后重新运行代码,你会发现那个形状不匹配的警告消失了,模型可以正常训练。
内容的提问来源于stack exchange,提问作者MardoG
相关产品推荐
相关产品推荐

