one_hot编码
独热编码一般是在有监督学习中对数据集进行标注时使用,指的是在分类问题中,将存在数据类别的那一类用X表示,不存在的用Y表示,这里的X常常是1, Y常常是0;
例如最常见的mnist手写数字识别任务,用one_hot进行编码,如下所示:
数字0,[1,0,0,0,0,0,0,0,0,0];
数字1,[0,1,0,0,0,0,0,0,0,0];
数字9,[0,0,0,0,0,0,0,0,0,1];
独热编码也适用于多分类任务,特别是损失函数为交叉熵损失的时候。
tensorflow的one_hot编码
tf.one_hot(
indices,
depth,
on_value=None,
off_value=None,
axis=None,
dtype=None,
name=None
)
indices表示输入的多个数值,通常是矩阵形式;
depth表示输出的尺寸;
on_value和off_value相当于是编码后的开闭值,即刚才描述的X值和Y值,默认为1和0;
axis指定编码的轴,代表新插入维度的位置,默认axis=-1,即最后一维;
dtype可以指定数据类型,默认值为 tf.float32;
返回值:返回一个one_hot张量。
官方文档解释
tf.one_hot(
indices,
depth,
on_value=None,
off_value=None,
axis=None,
dtype=None,
name=None
)
Returns a one-hot tensor(返回一个one_hot张量).
The locations represented by indices in indices take value on_value, while all other locations take value off_value.
(由indices指定的位置将被on_value填充, 其他位置被off_value填充).
on_value and off_value must have matching data types. If dtype is also provided, they must be the same data type as specified by dtype.
(on_value和off_value必须具有相同的数据类型).
If on_value is not provided, it will default to the value 1 with type dtype.
If off_value is not provided, it will default to the value 0 with type dtype.
If the input indices is rank N, the output will have rank N+1. The new axis is created at dimension axis (default: the new axis is appended at the end).
(如果indices是N维张量,那么函数输出将是N+1维张量,默认在最后一维添加新的维度).
If indices is a scalar the output shape will be a vector of length depth.
(如果indices是一个标量, 函数输出将是一个长度为depth的向量)
If indices is a vector of length features, the output shape will be:
features x depth if axis == -1.
(如果indices是一个长度为features的向量,则默认输出一个features*depth形状的张量)
depth x features if axis == 0.
(如果indices是一个长度为features的向量,axis=0,则输出一个depth*features形状的张量)
If indices is a matrix (batch) with shape [batch, features], the output shape will be:
batch x features x depth if axis == -1
(如果indices是一个形状为[batch, features]的矩阵,axis=-1(默认),则输出一个batch * features * depth形状的张量)
batch x depth x features if axis == 1
(如果indices是一个形状为[batch, features]的矩阵,axis=1,则输出一个batch * depth * features形状的张量)
depth x batch x features if axis == 0
(如果indices是一个形状为[batch, features]的矩阵,axis=0,则输出一个depth * batch * features形状的张量)
官方示例
indices = [0, 1, 2] #输入数据(是个向量)需要编码的indices索引是[0,1,2]
depth = 3
tf.one_hot(indices, depth) # output: [3 x 3]
# [[1., 0., 0.],
# [0., 1., 0.],
# [0., 0., 1.]]
indices = [0, 2, -1, 1] #输入数据(是个向量)的需要编码的indices索引是[0,2,-1,1]
depth = 3
tf.one_hot(indices, depth,
on_value=5.0, off_value=0.0,
axis=-1) # output: [4 x 3]
# [[5.0, 0.0, 0.0], # one_hot(0) 对位置0处的数据进行one_hot编码
# [0.0, 0.0, 5.0], # one_hot(2) 对位置2处的数据进行one_hot编码
# [0.0, 0.0, 0.0], # one_hot(-1) 对位置-1处的数据进行one_hot编码
# [0.0, 5.0, 0.0]] # one_hot(1) 对位置1处的数据进行one_hot编码
indices = [[0, 2], [1, -1]] #输入数据是个2维矩阵
depth = 3
tf.one_hot(indices, depth,
on_value=1.0, off_value=0.0,
axis=-1) # output: [2 x 2 x 3]
# [[[1.0, 0.0, 0.0], # one_hot(0) 对位置(0,0)处的数据进行one_hot编码
# [0.0, 0.0, 1.0]], # one_hot(2) 对位置(0,2)处的数据进行one_hot编码
# [[0.0, 1.0, 0.0], # one_hot(1) 对位置(1,1)处的数据进行one_hot编码
# [0.0, 0.0, 0.0]]] # one_hot(-1) 对位置(1,-1)处的数据进行one_hot编码