『TensorFlow』one_hot化标签

tf.one_hot(indices, depth):将目标序列转换成one_hot编码

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

indices = [0, 2, -1, 1]
depth = 3
on_value = 5.0 
off_value = 0.0 
axis = -1 
#Then output is [4 x 3]: 
output = 
[5.0 0.0 0.0] // one_hot(0) 
[0.0 0.0 5.0] // one_hot(2) 
[0.0 0.0 0.0] // one_hot(-1) 
[0.0 5.0 0.0] // one_hot(1)

with tf.Session() as sess:
  print(sess.run(tf.one_hot(np.array([np.array([0,1,2,3]),np.array([2,0,3,2])]),depth=4,axis=-1)))

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


oh = tf.one_hot(indices = [0, 2, -1, 1], depth = 3,  on_value = 5.0 , off_value = 0.0, axis = -1)
sess = tf.Session()
sess.run(oh)

# array([[5., 0., 0.],
#        [0., 0., 5.],
#        [0., 0., 0.],
#        [0., 5., 0.]], dtype=float32)

 

另一种思路:稀疏张量构建法

import numpy as np
import tensorflow as tf

NUMCLASS = 3
batch_size = 5

labels = tf.placeholder(dtype=tf.int32, shape=[batch_size, 1])
index = tf.reshape(tf.range(0, batch_size,1), [batch_size, 1])
one_hot = tf.sparse_to_dense(
                             tf.concat(values=[index, labels], axis=1),
                             [batch_size, NUMCLASS],
                             1.0, 0.0
                             )
with tf.Session() as sess:
    lab = np.random.randint(0,3,[5,1])
    print(sess.run(one_hot, feed_dict={labels:lab}))
    print(sess.run(tf.one_hot(np.squeeze(lab),depth=3,axis=1)))

注意两种方法输入数据维度的变化(稀疏法为了得到足够的索引需要升维),结果如下:

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

 

posted @ 2018-03-14 16:13  叠加态的猫  阅读(4335)  评论(0编辑  收藏  举报