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

使用Keras构建的NN输出float32预测值而非实际类别1、2、3的原因

解决葡萄酒分类NN预测结果为概率数组而非类别值的问题

嗨,我来帮你搞定这个问题~你现在得到的float32数组其实是模型输出的类别概率分布,这是因为你最后一层用了softmax激活函数——它的作用就是把模型的原始输出转换成每个类别的概率(每个元素对应属于该类别的可能性,总和为1),所以直接转int会把0-1之间的浮点数截断成0,这肯定不对啦。

为什么会出现4列概率?

看你的y_pred[:5]输出是4个元素的数组,但你说实际类别是1、2、3,这说明你的标签编码可能出了问题:你用categorical_crossentropy损失时,需要把标签做one-hot编码,但如果直接对原始类别1、2、3做编码,to_categorical会默认生成4列(因为最大类别是3,索引从0到3),但我们只需要3列对应类别1、2、3(转成0、1、2的索引后编码)。

完整修正步骤

  1. 修正标签编码与模型结构
    先把原始类别1、2、3转换成0、1、2的索引,再做one-hot编码,同时调整模型最后一层的神经元数量匹配类别数:

    from keras.utils import to_categorical
    
    # 原始y是1、2、3,转成0、1、2的索引
    y_train_encoded = y_train - 1
    y_test_encoded = y_test - 1
    
    # 生成3列的one-hot编码
    y_train1 = to_categorical(y_train_encoded, num_classes=3)
    y_test1 = to_categorical(y_test_encoded, num_classes=3)
    
    # 修正模型最后一层神经元数量
    model = Sequential()
    model.add(Dense(13, activation='relu', input_shape=(12,)))
    model.add(Dense(3, activation='softmax'))  # 把原来的4改成3,对应3个类别
    
  2. 从概率数组得到实际类别
    用np.argmax()找到每个样本概率最大的索引,再转回1、2、3的类别:

    import numpy as np
    
    y_pred = model.predict(X_test)
    # 获取每个样本概率最高的类别索引(0、1、2)
    y_pred_indices = np.argmax(y_pred, axis=1)
    # 转回原始类别1、2、3
    y_pred_classes = y_pred_indices + 1
    

    这样y_pred_classes就是你想要的1、2、3的类别数组啦。

为什么直接转int会得到全0?

因为softmax输出的都是0到1之间的浮点数,直接用int()转换会截断小数部分,所有值都会变成0,这完全不是我们要的类别判断逻辑,必须用argmax来找到概率最高的类别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:57:03