Keras构建RNN二元分类报错:ValueError: logits与labels形状不匹配
问题分析与修复方案
核心错误原因
- 模型结构错误:你声明要构建循环神经网络(RNN),但代码里只用了
Dense全连接层,没有任何RNN类层(如SimpleRNN、LSTM)。Dense层无法正确处理3D时序输入(形状为(样本数, 时间步长, 特征数)),导致最终输出形状为(None, 90, 1),而标签saida_real形状为(None,),二者不匹配触发报错。 - 标签不符合二元分类要求:当前
saida_real是经MinMaxScaler归一化的连续值,二元分类要求标签必须是0或1的离散值。
修复步骤及完整代码
1. 导入RNN层
先导入Keras的RNN相关层,这里以SimpleRNN为例。
2. 修正二元标签
从数据集名称来看,resultado列对应轮盘红/黑结果,需将其转为0/1的离散标签,无需归一化。
3. 调整模型结构
用RNN层作为第一层处理3D时序输入,压缩时序维度为2D特征,再接全连接层输出分类结果。
修改后的完整代码:
from keras.models import Sequential from keras.layers import Dense, SimpleRNN # 导入SimpleRNN层 from sklearn.preprocessing import MinMaxScaler import numpy as np import pandas as pd columns = ['data', 'resultado'] base = pd.read_csv("blaze_values_27_01_2023_VERMELHO_1.csv", header=None, names=columns) base = base.dropna() # 修正:将结果转为二元标签(根据实际数据调整判断条件,示例为红=1,其他=0) base['resultado'] = base['resultado'].apply(lambda x: 1 if x == 'vermelho' else 0) base_treinamento = base.iloc[:, 1:2].values # 仅对特征做归一化,标签保持二元值 normalizador = MinMaxScaler(feature_range=[0,1]) base_treinamento_normalizada = normalizador.fit_transform(base_treinamento) previsores = [] saida_real = [] # 构建时序样本:用前90条数据预测第91条的结果 for i in range(90, len(base_treinamento_normalizada)): previsores.append(base_treinamento_normalizada[i-90:i, 0]) saida_real.append(base['resultado'].iloc[i]) previsores, saida_real = np.array(previsores), np.array(saida_real) # 调整为RNN要求的输入形状:(样本数, 时间步长, 特征数) previsores = np.reshape(previsores, (previsores.shape[0], previsores.shape[1], 1)) # 构建RNN模型 regressor = Sequential() # 第一层SimpleRNN,输出维度64,只返回最后时间步的结果 regressor.add(SimpleRNN(units=64, input_shape=(previsores.shape[1], 1), return_sequences=False)) regressor.add(Dense(32, activation='relu')) # 输出层用sigmoid激活适配二元分类 regressor.add(Dense(1, activation='sigmoid')) # 编译模型,二元分类用binary_crossentropy损失 regressor.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # 开始训练 regressor.fit(previsores, saida_real, epochs=100, batch_size=32)
关键修改说明
- 添加RNN层:
SimpleRNN专门处理时序数据,return_sequences=False将3D输入转换为2D特征,确保后续输出形状与标签匹配。 - 修正标签逻辑:直接将原始结果转为0/1二元值,符合二元分类的标签要求。
- 调整样本构建:从原始数据中提取二元标签,不再使用归一化后的连续值作为标签。
内容的提问来源于stack exchange,提问作者Samuel Tosetto
相关产品推荐
相关产品推荐

