搭建股票预测GRU模型时出现输入维度不匹配报错该如何解决
错误核心原因
- 多余的Embedding层是直接触发维度报错的根源:Embedding层仅适用于离散整数ID类输入(比如文本的词编号),你的输入是连续型股票特征,完全不需要该层。原3维输入
(样本数, 时间步20, 特征数320)经过Embedding层后,会给每个特征单独映射为50维向量,最终输出4维张量(None, 20, 320, 50),而GRU层要求输入必须是3维,因此直接抛出维度不匹配错误。 - 重复设置GRU的input_shape属于无效配置:只有第一层网络需要指定输入形状,后续层会自动推导输入维度,且你填写的
input_shape=(train_x.shape[1],1)和实际特征数320完全不符。 - 输出层与损失函数和二分类任务不匹配:你的标签是0/1二元变量,输出层应该用1个神经元加sigmoid激活,损失函数选择二元交叉熵,原配置用2个神经元+均方误差会严重影响模型收敛效果。
修正后可运行代码
import tensorflow as tf from tensorflow.keras import Sequential, layers from tensorflow.keras.optimizers import SGD # 提前定义超参数,可根据需求调整数值 EPOCHS = 50 BATCH_SIZE = 32 def GRU_model(train_x,train_y,val_x,val_y): model = Sequential() # 第一层GRU指定正确输入形状:(时间步长度, 特征数) model.add(layers.GRU(50, return_sequences=True, input_shape=(train_x.shape[1], train_x.shape[2]), activation='tanh')) model.add(layers.GRU(50, return_sequences=True, activation='tanh')) model.add(layers.GRU(50, return_sequences=True, activation='tanh')) model.add(layers.GRU(50, activation='tanh')) # 适配二分类任务的输出层 model.add(layers.Dense(units=1, activation='sigmoid')) # 损失函数替换为二分类交叉熵,新增准确率指标方便观测训练效果 model.compile(optimizer=SGD(learning_rate=0.01, decay=1e-7, momentum=0.9, nesterov=False), loss='binary_crossentropy', metrics=['accuracy']) model.fit(train_x, train_y, epochs=EPOCHS, batch_size=BATCH_SIZE, validation_data=(val_x, val_y)) GRU_predict = model.predict(val_x) # 若需要直接输出0/1预测结果,可添加下行代码: # GRU_predict = (GRU_predict > 0.5).astype(int) return model, GRU_predict my_gru_model, my_gru_predict = GRU_model(train_x, train_y, validation_x, validation_y)
维度校验说明
修正后输入train_x的形状为(1122, 20, 320),直接匹配GRU层要求的3维输入格式(批量大小, 时间步, 特征数),不会再出现维度不匹配的报错。
内容的提问来源于stack exchange,提问作者moth
相关产品推荐
相关产品推荐

