Skip to main content

什么是onehot编码

这么高大上的名字,顾名思义,就是在编码中只有一个1,其他是0。
眼熟吧。在Pyton神经网络编程这本书中,已经见过了。神经网络的输出中,用1000000000代表1,用01000000000代表1,以此类推,用0000000001代表9。
tf.one_hot()函数是将input转化为one-hot类型数据输出,相当于将多个数值联合放在一起作为多个相同类型的向量,可用于表示各自的概率分布,通常用于分类任务中作为最后的FC层的输出,有时翻译成“独热”编码。

tensorflow的help中相关说明如下:

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

indices表示输入的多个数值,通常是矩阵形式;depth表示输出的尺寸。
由于one-hot类型数据长度为depth位,其中只用一位数字表示原输入数据,这里的on_value就是这个数字,默认值为1,one-hot数据的其他位用off_value表示,默认值为0。

tf.one_hot()函数规定输入的元素indices从0开始,最大的元素值不能超过(depth - 1),因此能够表示(depth + 1)个单位的输入。若输入的元素值超出范围,输出的编码均为 [0, 0 … 0, 0]。

indices = 0 对应的输出是[1, 0 … 0, 0], indices = 1 对应的输出是[0, 1 … 0, 0], 依次类推,最大可能值的输出是[0, 0 … 0, 1]。

代码示例如下:
---------------------
import tensorflow as tf
import numpy as np
t=[0,1,2,3,4]#onehot编码数据必须是整形
#indices, depth, on_value=None, off_value=None, axis=None, dtype=None
indices=t
depth=5#不能小于t的长度
sess=tf.Session()
on_value=1#默认是1,也可以设置为其他值,比如9
off_value=0#默认是0,也可以设置为其他数值,比如2
axis=0#默认是0,纵轴方向编码,0是纵轴,1是横轴,类似于相互转置
oh1=tf.one_hot(t,depth=depth,axis=axis)
oh2=tf.one_hot(t,depth=depth,axis=axis,on_value=9,off_value=2)
print(sess.run(oh1))
print(sess.run(oh2))
#输出结果点击链接

Comments

Popular posts from this blog

tf.slice用法

函数:tf.slice(inputs, begin, size, name) 作用:从列表、数组、张量等对象中抽取一部分数据 begin和size是两个多维列表,他们共同决定了要抽取的数据的开始和结束位置 begin表示从inputs的哪几个维度上的哪个元素开始抽取 ,begin基于下标0开始 size表示在inputs的各个维度上抽取的元素个数 若begin[]或size[]中出现-1,表示抽取对应维度上的所有元素 测试:如下是一个三维Tensor数据表 import tensorflow as tf import numpy as np #这个代码演示测试tf.slice函数 t=[[[1,1,1],[2,2,2]],[[3,3,3],[4,4,4]],[[5,5,5],[6,6,6]]] s1=tf.slice(t,[1,0,0],[1,1,3]) #begin=[1,0,0],表明从第1维的[0,0]开始切片,也就是从[3,3,3]开始 #size=[1,1,3]表明切片后是1维,切片的尺寸为1行3列。 s2=tf.slice(t,[0,1,1],[2,1,1]) #begin=[0,1,1],表明从第0维的[1,1]开始切片,也就是从[2,2,2]的第二个2开始 #size=[2,1,1]表明切片后是2维,切片的尺寸为1行1列。 sess=tf.Session() print(sess.run(s1)) #输出结果为 [[[3 3 3]]] ,一行三列 print(sess.run(s2)) #输出结果: [[[2]] [[4]]] #测试维度: print(sess.run(s1).shape) print(sess.run(s2).shape) #结果如下 (1, 1, 3) (2, 1, 1) 下面的立体图说明切片的实际方法: (size的大小不能大于切片刀下方表格数据的尺寸,维度数不能大于被切片数据的维度) 以s2为例

TF random_normal和Python random.normal的用法

先看TF tf.random_normal()函数用于从服从指定正太分布的数值中取出指定个数的值。 tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None) 再看NP np.random.normal()给出均值为loc,标准差为scale的高斯随机数(场). numpy.random.normal(loc=0.0, scale=1.0, size=None) 所谓正态分布==高斯分布,所以二者一回事 mean==loc==均值(或称期待值) stddev==scale==标准差 shape==size==输出形状,二者在处理这个参数时候(a,b)==[a,b],其中,np的normal对参数格式要求更灵活一些。 比如创建随机数的一行两列数组: np.random.normal([2])==np.random.normal((2))==np.random.normal(0,1,2)注意最后一种用法必须带上前面两个参数,否则传递参数时候会把2当作均值传递 而tf的random_normal对shape的要求不能是数字,必须为[]或()格式 再探究一下形状参数的规律,看下面代码 a=np.random.normal(0,1,(2,1)) b=np.random.normal(0,1,(1,2)) c=np.random.normal(0,1,(2)) print(a) print(a.shape) print(b) print(b.shape) print(c) print(c.shape) 程序输出如下 [[ 1.11843359] [-0.69801129]] (2, 1) [[-0.87110089 -0.46089345]] (1, 2) [ 0.88227522 -0.26728542] (2,) a,b是二维的矩阵,c是一维的矩阵(严格说一维的不是矩阵)

tf.transpose矩阵的转置

二维矩阵的转置很简单,元素的i,j坐标交换就行。多为矩阵的转换复杂,遵循什么规律呢? 先看看代码: import tensorflow as tf import numpy as np print("二维矩阵的转置\n") t=[[1,2,3],[4,5,6]] t1=tf.transpose(t) t2=tf.transpose(t,[0,1])#[0,1]是正常的坐标轴排列顺序,运行结果不转置 t3=tf.transpose(t,[1,0]) sess=tf.Session() print("Default Transepose is:\n",sess.run(t1),"\n[0,1] Tranpose is:\n",sess.run(t2),"\n[1,0] Tranpose is:\n",sess.run(t3)) print("三维矩阵的转置") t=[[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]]#这个三维矩阵有两张表格,每个表格都是2行3列 print("先测试不带perm参数的默认转置和参数顺序为不转置的正常坐标轴顺序[0,1,2]转置结果") t1=tf.transpose(t) t2=tf.transpose(t,[0,1,2]) print(sess.run(t1)) print(sess.run(t2)) 代码输出如下: 二维矩阵的转置 Default Transepose is: [[1 4] [2 5] [3 6]] [0,1] Tranpose is: [[1 2 3] [4 5 6]] [1,0] Tranpose is: [[1 4] [2 5] [3 6]] 三维矩阵的转置 先测试不带perm参数的默认转置和参数顺序为不转置的正常坐标轴顺序[0,1,2]转置结果 [[[ 1 7] [ 4 10]] [[ 2 8] [ 5 11]] [[ 3 9] [ 6 12]]] 这里分析一下元素的坐标在转换前和转换后的变化: 1:(0,0,0)==>(