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

Keras报错:logits and labels must have the same first dimension

问题分析

你遇到的维度报错核心是模型输出(logits)、标签格式、损失函数三者不匹配,先明确两个基础概念:

  • logits:模型最后一层输出的未经过激活转换的原始预测值
  • labels:你传入fit方法的真实标签y

报错里提到的「第一维度必须一致」,第一维度指的是样本批量大小:框架要求一个批量里,预测值的样本数和真实标签的样本数必须完全相等。

你的代码存在3个直接触发错误的问题:

  1. 输出层维度和任务不匹配
    你现在最后一层Dense(3),意味着模型输出形状是(样本数, 3),但你传入的y形状是(1,5),框架在计算损失时自动把y压成了形状(5,),导致样本数维度(logits是1,labels是5)直接对不上。
  2. 损失函数选型错误
    sparse_categorical_crossentropy是专门给单标签多分类任务用的损失,要求两个前提:
    • 标签是形状为(样本数,)的一维整数数组,每个值是0到「类别数-1」的类别索引
    • 模型最后一层输出维度等于总类别数,且搭配softmax激活
      你的y是二维数组,还出现了数值6,完全不符合该损失函数的输入要求。
  3. 任务逻辑混淆
    从你构造的x和y的格式看,你要做的是回归任务(输入5维特征,预测5维连续数值),不是分类任务,用分类损失自然会报错。
修复方案

如果你的目标是做5维数值的回归预测,按如下修改即可运行:

import numpy
from tensorflow import keras
from tensorflow.keras import layers

x = numpy.array([[1,2,3,4,5]])
y = numpy.array([[3,2,3,6,5]])

model = keras.Sequential(
    [
        layers.Input(shape=(5,)),
        layers.Dense(3, activation="relu", name="layer1"),
        layers.Dense(3, activation="relu", name="layer2"),
        # 输出维度改为5,和要预测的y的最后一维对齐
        layers.Dense(5, name="layer3"),
    ]
)

# 替换为回归任务常用的均方误差损失
model.compile(optimizer=keras.optimizers.Adam(learning_rate=.0001), loss='mse')
    
model.fit(x, y, batch_size=10, epochs=11, verbose=2)

如果你确实要做单标签分类任务,需要同步调整两处配置:

  • 确认总分类类别数N,将最后一层改为layers.Dense(N, activation="softmax", name="layer3")
  • 将标签y处理为形状(样本数,)的一维整数数组,每个标签值范围在0~N-1之间

内容的提问来源于stack exchange,提问作者dse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:09:25