tensorflow如何将one_hot标签和数字(整数)标签进行相互转化

 更新时间:2023年06月25日 10:36:21   作者:无敌右脑  
这篇文章主要介绍了tensorflow如何将one_hot标签和数字(整数)标签进行相互转化问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

将one_hot标签和数字(整数)标签进行相互转化

tensorflow自带one_hot标签函数

tensorflow 有封装好的函数可以直接将整数标签转化为one_hot标签

import tensorflow as tf 
label = [1,0,2,3,0]
y = tf.one_hot(label, depth=4).numpy()    
#使用ont_hot返回的是tensor张量,再用numpy取出数组
print(y)

得到:

[[0. 1. 0. 0.]
[1. 0. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]
[1. 0. 0. 0.]]

将one-hot转化为数字标签

将one-hot转化为数字标签没有封装好的函数,可以遍历并使用soft argmax取出整数:

label = [np.argmax(i) for i in y] 
print(label)

得到:

[1, 0, 2, 3, 0]

tensorflow中one_hot讲解以及多分类标签与one-hot转换

TensorFlow的one-hot函数讲解

import tensorflow as tf
tf.one_hot(indices, depth, on_value, off_value, axis)

indices是一个列表,指定张量中独热向量的独热位置,或者说indeces是非负整数表示的标签列表。len(indices)就是分类的类别数。

tf.one_hot返回的张量的阶数为indeces的阶数+1。

当indices的某个分量取-1时,即对应的向量没有独热值。

  • depth是每个独热向量的维度
  • on_value是独热值
  • off_value是非独热值

axis指定第几阶为depth维独热向量,默认为-1,即,指定张量的最后一维为独热向量

例如:对于一个2阶张量而言,axis=0时,即,每个列向量是一个独热的depth维向量

axis=1时,即,每个行向量是一个独热的depth维向量。axis=-1,等价于axis=1

import tensorflow as tf
# 得到4个5维独热行向量向量,
#    其中第1个向量的第0个分量是独热1,
#    第2个向量的第2个分量是独热,
#    第3个向量没有独热,因为指定为-1
#    第4个向量的第1个分量为独热
# labels向targets的转变
labels = [0, 2, -1, 1]
# labels是shape=(4,)的张量。则返回的targets是shape=(len(labels), depth)张量。
# 且这种情况下,axis=-1等价于axis=1
targets = tf.one_hot(indices=labels, depth=5, on_value=1.0, off_value=0.0, axis=-1)
with tf.Session() as sess:
    print(sess.run(targets))
[[ 1.  0.  0.  0.  0.]
 [ 0.  0.  1.  0.  0.]
 [ 0.  0.  0.  0.  0.]
 [ 0.  1.  0.  0.  0.]]
# 得到1个5维独热行向量。
targets = tf.one_hot(indices=3, depth=5, on_value=1.0, off_value=0.0, axis=0)
with tf.Session() as sess:
     print(sess.run(targets))
[ 0.  0.  0.  1.  0.]
# 得到1个5维独热列向量
targets = tf.one_hot(indices=[3], depth=5, on_value=1.0, off_value=0.0, axis=0)
with tf.Session() as sess:
     print(sess.run(targets))
[[ 0.]
[ 0.]
[ 0.]
[ 1.]
[ 0.]]
targets = tf.one_hot(indices=[[0,1],[1,0]], depth=3)
with tf.Session() as sess:
    print(sess.run(targets))
[[[ 1.  0.  0.]
  [ 0.  1.  0.]]
 [[ 0.  1.  0.]
  [ 1.  0.  0.]]]

注:indices如果是n阶张量,则返回的one-hot张量则为n+1阶张量

在实际神经网络的设计应用中,给定的labels通常是数字列表,以标识样本属于哪一个分类。类别数则是独热向量的维数。

# 得到分类的独热向量
targets = tf.one_hot(labels, num_classes)

TensorFlow 多分类标签转换成One-hot

在处理多分类问题时,将多分类标签转成One-hot编码是一种很常见的手段,以下即为Tensorflow将标签转成One-hot的tensor。以Mnist为例,如果标签为“3”,则One-hot编码为[0,0,0,1,0,0,0,0,0,0].

import tensorflow as tf  # version : '1.12.0'
NUM_CLASSES = 10 # 10分类
labels = [0,1,2,3] # sample label
batch_size = tf.size(labels) # get size of labels : 4
labels = tf.expand_dims(labels, 1) # 增加一个维度
indices = tf.expand_dims(tf.range(0, batch_size,1), 1) #生成索引
concated = tf.concat([indices, labels] , 1) #作为拼接
onehot_labels = tf.sparse_to_dense(concated, tf.stack([batch_size, NUM_CLASSES]), 1.0, 0.0) # 生成one-hot编码的标签

将稀疏矩阵转换成密集矩阵,其中索引在concated中,值为1.其他位置的值为默认值0.

方法1:

from sklearn.preprocessing import OneHotEncoder,LabelEncoder
a = ['A','B','A','C']
label_encoder=LabelEncoder()
label_value = label_encoder.fit_transform(a)
enc = OneHotEncoder()
one_hot=enc.fit_transform(label_value.reshape(-1,1))
one_hot.toarray()
array([[1., 0., 0.],
       [0., 1., 0.],
       [1., 0., 0.],
       [0., 0., 1.]])

方法2:

from sklearn.preprocessing import LabelBinarizer
encoder = LabelBinarizer()
one_hot = encoder.fit_transform(a)
print(one_hot)
array([[1, 0, 0],
       [0, 1, 0],
       [1, 0, 0],
       [0, 0, 1]])

方法3:

import numpy as np
def dense_to_one_hot(labels_dense, num_classes):
    """Convert class labels from scalars to one-hot vectors."""
    num_labels = labels_dense.shape[0]
    index_offset = np.arange(num_labels) * num_classes
    labels_one_hot = np.zeros((num_labels, num_classes))
    labels_one_hot.flat[index_offset+labels_dense.ravel()] = 1
    return labels_one_hot
labels_dense = np.array([0,1,2,3,4]) 
num_classes  = 5
one_hot = dense_to_one_hot(labels_dense,num_classes)
print(one_hot)
[[1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]]

keras中多分类标签转换成One-hot

import numpy as np
from keras.utils import to_categorical
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 7]
data = array(data)
print(data)
# [1 2 3 4 5 6 7 8 9 7]
#有普通np数组转换为one-hot
one_hots = to_categorical(data)
print(one_hots)
# [[ 0.  1.  0.  0.  0.  0.  0.  0.  0.  0.]
#  [ 0.  0.  1.  0.  0.  0.  0.  0.  0.  0.]
#  [ 0.  0.  0.  1.  0.  0.  0.  0.  0.  0.]
#  [ 0.  0.  0.  0.  1.  0.  0.  0.  0.  0.]
#  [ 0.  0.  0.  0.  0.  1.  0.  0.  0.  0.]
#  [ 0.  0.  0.  0.  0.  0.  1.  0.  0.  0.]
#  [ 0.  0.  0.  0.  0.  0.  0.  1.  0.  0.]
#  [ 0.  0.  0.  0.  0.  0.  0.  0.  1.  0.]
#  [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  1.]
#  [ 0.  0.  0.  0.  0.  0.  0.  1.  0.  0.]]

one_hot 转数组

# 由one-hot转换为普通np数组
data = [argmax(one_hot)for one_hot in one_hots]
print(data)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 7]

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Django ORM 事务和查询优化的操作方法

    Django ORM 事务和查询优化的操作方法

    这篇文章主要介绍了Django ORM 事务和查询优化,包括事务操作、ORM 惰性查询及only与defer相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • 利用Python实现一个可定制风格的绘图系统

    利用Python实现一个可定制风格的绘图系统

    这篇文章主要为大家详细介绍了如何基于Python实现一个可定制风格的绘图系统,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解下
    2023-09-09
  • python安装scipy的方法步骤

    python安装scipy的方法步骤

    在本篇文章里小编给各位分享了关于python怎么安装scipy的具体方法和实例代码,需要的朋友们学习下。
    2019-06-06
  • python六种基本数据类型及常用函数展示

    python六种基本数据类型及常用函数展示

    这篇文章主要为大家介绍了python六种基本数据类型及常用函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • Python绘制正二十面体图形示例

    Python绘制正二十面体图形示例

    正二十面体由20个小的正三角形面组成,每个顶点周围有 5 个顶点,下面这篇文章主要给大家介绍了关于Python绘制正二十面体图形的相关资料,需要的朋友可以参考下
    2022-12-12
  • python可视化分析绘制带趋势线的散点图和边缘直方图

    python可视化分析绘制带趋势线的散点图和边缘直方图

    这篇文章主要介绍了python可视化分析绘制带趋势线的散点图和边缘直方图,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • 利用Python requests库爬取高德地图全国地铁站点信息

    利用Python requests库爬取高德地图全国地铁站点信息

    requests 模块是 python 基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库,它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求,这篇文章主要介绍了利用Python requests库爬取高德地图全国地铁站点信息,需要的朋友可以参考下
    2024-03-03
  • 使用Python处理BAM的方法

    使用Python处理BAM的方法

    这篇文章主要介绍了使用Python处理BAM的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • Python 写入训练日志文件并控制台输出解析

    Python 写入训练日志文件并控制台输出解析

    这篇文章主要介绍了Python 写入训练日志文件并控制台输出解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Python3指定路径寻找符合匹配模式文件

    Python3指定路径寻找符合匹配模式文件

    这篇文章主要介绍了Python3指定路径寻找符合匹配模式文件,涉及Python文件查找与模式匹配的相关技巧,需要的朋友可以参考下
    2015-05-05

最新评论