You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras构建RNN二元分类报错:ValueError: logits与labels形状不匹配

问题分析与修复方案

核心错误原因

  1. 模型结构错误:你声明要构建循环神经网络(RNN),但代码里只用了Dense全连接层,没有任何RNN类层(如SimpleRNN、LSTM)。Dense层无法正确处理3D时序输入(形状为(样本数, 时间步长, 特征数)),导致最终输出形状为(None, 90, 1),而标签saida_real形状为(None,),二者不匹配触发报错。
  2. 标签不符合二元分类要求:当前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:50:40