使用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、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个类别从概率数组得到实际类别
用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
相关产品推荐
相关产品推荐

