编程语言
首页 > 编程语言> > python之独热编码的实现

python之独热编码的实现

作者:互联网



        独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。
在这里插入图片描述        上图表示的是独热编码(“one hot” encoding)的转换过程,在转换后的表示中,每列的一个元素是“hot”(意思是设置为1)。

        独热编码的实现可以在numpy中编写代码进行转换,也可以在tensorflow中实现。

numpy实现

def convert_to_one_hot(Y, C):
    Y = np.eye(C)[Y.reshape(-1)].T    return Y

        np.eye( C) 是构造一个对角线为1的对角矩阵, Y.reshape(-1) 把Y压缩成向量,numpy中向量shape是(n,),矩阵shape是(1, n)],np.eye( C)[Y.reshape(-1)] 就是取对角矩阵的相应行将其转成one-hot的形式,最后 .T 做转置。

import numpy as npdef convert_to_one_hot(Y, C):

    Y = np.eye(C)[Y.reshape(-1)].T    return Y

y = np.array([[3,2,1,3,0]])print(y.shape)print(y.reshape(-1).shape)C = 4print(convert_to_one_hot(y, C))

结果:

(1, 5)(5,)[[0. 0. 0. 0. 1.]
 [0. 0. 1. 0. 0.]
 [0. 1. 0. 0. 0.]
 [1. 0. 0. 1. 0.]]

tensorflow实现

one_hot_matrix = tf.one_hot(indices, depth, on_value=None, off_value=None, axis=None, dtype=None, name=None)

        indices: 代表了on_value所在的索引,其他位置值为off_value。类型为tensor,其尺寸与depth共同决定输出tensor的尺寸。
        depth: 编码深度。
        on_value & off_value为编码开闭值,缺省分别为1和0,indices指定的索引处为on_value值。
        axis: 编码的轴,分情况可取-1、0或-1、0、1,默认为-1
        dtype: 默认为 on_value 或 off_value的类型,若未提供on_value或off_value,则默认为tf.float32类型。
        返回一个 one-hot tensor。

        如果indices是一个长度为features的向量,当axis == 0时输出尺寸为depth * features;当axis==-1时输出尺寸为features * depth;当axis = 1时,同axis = -1。
        如果indices是一个尺寸为[batch,features]的矩阵,当axis == 0时输出尺寸为depth * batch * features;当axis==-1时输出尺寸为batch * features * depth;当axis==1时输出尺寸为batch * depth * features。

1、indices是一个长度为features的向量

import tensorflow as tf

indices = [5,2,1,3,0]depth = 4one_hot_matrix = tf.one_hot(indices,depth,axis=0)sess = tf.compat.v1.Session()one_hot = sess.run(one_hot_matrix)sess.close()print(one_hot)

结果:

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

import tensorflow as tf

indices = [5,2,1,3,0]depth = 4one_hot_matrix = tf.one_hot(indices,depth,axis=-1)sess = tf.compat.v1.Session()one_hot = sess.run(one_hot_matrix)sess.close()print(one_hot)

结果:

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

2、indices是一个尺寸为[batch, features]的矩阵

import tensorflow as tf

indices = [[5,2,1],[2,3,0]]depth = 4one_hot_matrix = tf.one_hot(indices,depth,axis=0)sess = tf.compat.v1.Session()one_hot = sess.run(one_hot_matrix)sess.close()print(one_hot)

结果:

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

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

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

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

import tensorflow as tf

indices = [[5,2,1],[2,3,0]]depth = 4one_hot_matrix = tf.one_hot(indices,depth,axis=-1)sess = tf.compat.v1.Session()one_hot = sess.run(one_hot_matrix)sess.close()print(one_hot)

结果:

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

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

import tensorflow as tf

indices = [[5,2,1],[2,3,0]]depth = 4one_hot_matrix = tf.one_hot(indices,depth,axis=1)sess = tf.compat.v1.Session()one_hot = sess.run(one_hot_matrix)sess.close()print(one_hot)

结果:

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

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

               

标签:编码,features,python,独热,depth,tf,hot,indices,axis
来源: https://blog.51cto.com/u_15178976/2729137