Python:如何将Keras to_categorical生成的矩阵转回整数?
实现to_categorical的反向操作方法
刚好做过类似的操作,这其实是one-hot编码的逆过程,有几种简单好用的实现方式,完全能满足你的需求:
方法一:用NumPy实现(通用方案)
这是最通用的方法,不管你有没有在用Keras都能直接用。核心思路就是找到每行中最大值对应的索引,再把索引从0-4偏移为1-5的整数。
代码示例:
import numpy as np # 模拟你的输入二维数组(包含浮点数) prob_matrix = np.array([ [0.025, 0.022, 0.58, 0.011, 0.22], [0.9, 0.05, 0.03, 0.01, 0.01], [0.01, 0.02, 0.03, 0.9, 0.04] ]) # 反向转换:取每行最大值的索引,再加1 original_labels = np.argmax(prob_matrix, axis=1) + 1 print(original_labels) # 输出:array([3, 1, 4])
注意: axis=1 参数指定按行来查找最大值的位置,这刚好对应你每行对应一个样本的结构。因为NumPy的argmax返回的索引从0开始,而你的原始标签是1-5,所以必须加1来修正偏移,这一步很关键哦。
方法二:用Keras/TensorFlow内置函数(适配你的工作流)
如果你本身就在用Keras或者TensorFlow的工作流,也可以用框架自带的函数来实现,逻辑和NumPy完全一致:
代码示例:
import tensorflow as tf from tensorflow.keras.utils import to_categorical # 假设你有一个TensorFlow张量或者NumPy数组 prob_matrix = tf.convert_to_tensor([ [0.025, 0.022, 0.58, 0.011, 0.22], [0.9, 0.05, 0.03, 0.01, 0.01] ]) # 反向转换 original_labels = tf.argmax(prob_matrix, axis=1) + 1 # 如果需要转换成NumPy数组,再加.numpy() original_labels_np = original_labels.numpy() print(original_labels_np) # 输出:array([3, 1])
额外说明
如果你的输入是Keras模型输出的概率张量,直接用tf.argmax就可以一步到位,不需要先转换成NumPy数组,非常方便。
另外,如果遇到某一行有多个相同的最大值(比如一行里两个元素都是0.5且是最大值),argmax会返回第一个出现的最大值的索引,这和to_categorical的正向逻辑是匹配的——因为正向操作中每个样本只会对应一个one-hot编码的类别。
内容的提问来源于stack exchange,提问作者konstantin
相关产品推荐
相关产品推荐

