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:
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:
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:
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)