训练GRU触发InvalidArgumentError维度越界问题求助
我是循环神经网络(RNN)领域的新手,正在学习TensorFlow时间序列教程,原教程用LSTM基于天气时间序列做预测,我想训练GRU模型对比性能,但调用教程里的WindowGenerator类的plot方法时,出现以下错误:
InvalidArgumentError: slice index 1 of dimension 2 out of bounds.
[Op:StridedSlice] name: strided_slice/
相关代码与输出
调用plot的代码:
wide_window.plot(gru_model)
GRU模型定义:
gru_model = tf.keras.models.Sequential([ tf.keras.layers.GRU(32, return_sequences=True), tf.keras.layers.Dense(units=1) ]) print('Input shape:', wide_window.example[0].shape) print('Output shape:', gru_model(wide_window.example[0]).shape)
输出信息:
Input shape: (32, 24, 19)
Output shape: (32, 24, 1)
wide_window定义:
wide_window = WindowGenerator(input_width=24, label_width=24, shift=1, label_columns=['T (degC)'])
问题原因
教程中的WindowGenerator.plot方法默认适配多特征输入输出的逻辑,它预期模型输出的第三维(特征维度)和输入的特征数一致。但你的GRU模型最后通过Dense(1)输出了单特征维度(shape=(32,24,1)),而输入有19个特征,plot方法在执行切片操作时试图访问第三维的索引1,超出了当前仅有的1个特征的范围,因此触发维度越界错误。
解决方法
方案1:调整模型输出为多特征维度
如果要和原LSTM模型的输出结构保持一致,将Dense层的units参数改为输入特征数19:
gru_model = tf.keras.models.Sequential([ tf.keras.layers.GRU(32, return_sequences=True), tf.keras.layers.Dense(units=19) # 匹配输入特征数19 ])
修改后模型输出shape变为(32,24,19),和输入特征维度匹配,plot方法即可正常运行。
方案2:适配单输出的绘图逻辑
如果只需要预测T (degC)这一个特征,可以选择以下两种方式:
指定plot方法的目标特征:
调用plot时明确传入label_columns参数,让方法只处理目标特征:wide_window.plot(gru_model, label_columns=['T (degC)'])手动绘图绕开原方法限制:
直接提取预测值和真实标签绘制对比图:import matplotlib.pyplot as plt # 获取示例数据与预测结果 inputs, labels = wide_window.example predictions = gru_model(inputs) # 提取目标特征的真实值与预测值 target_idx = wide_window.column_indices['T (degC)'] true_vals = labels[:, :, target_idx] pred_vals = predictions[:, :, 0] # 模型输出为单特征,取索引0 # 绘制对比图 plt.figure(figsize=(12, 6)) plt.plot(true_vals[0], label='真实值') plt.plot(pred_vals[0], label='预测值') plt.legend() plt.title('气温(T (degC))预测对比') plt.show()
内容的提问来源于stack exchange,提问作者Zoltán Orosz

