在阅读keras的中文文档时候,对于这里的代码不了解
y_train = keras.utils.to_categorical(np.random.randint(10, size=(1000, 1)), num_classes=10)
这里应该拆分为两部分看待
第一个是np.random.randint()
查看numpy文档知道:
random.randint ( low , high = None , size = None , dtype = int )
返回从低(包含)到高(不包含)的随机整数。
1.返回“半开”区间 [ low , high )内指定 dtype 的“离散均匀”分布中的随机整数。注意,如果 high为 None (默认值),即不写high,则结果来自 [0, low )。
2.size:int 或 int 元组,可选
表示给定形状。默认值为 None,在这种情况下返回单个值。可以使用元组表示多维,例如size=(2,2)就是形状为两行两列的矩阵
3.dtype ,可选
结果所需的类型。默认值为 long。
例如:
这里的3是输入给形参low的值,没有high,说明数值在[0,3)之间。
size=(10, 1)表示形状是10行一列的矩阵。我们看打印出来的数据,是一个10行1列矩阵,且每一个元素都是0或者1或者2。
第二个就是to_categorical(y, num_classesy, dtype)
其中:
y是待转换的标签数组。
num_class是标签中共有多少种类。
dtype则是转化的目标数据类型。
y_train = utils.to_categorical(rand, num_classes=10)
代码中,我们使用的数组为之前的rand,即一个10行1列的数组
dtype默认浮点型,不过我不知道是默认float32还是什么
而我们要了解num_class的应用。就必须要知道one-hot。
one-hot编码,又称独热编码、一位有效编码。其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。其中种类从0开始编码
我们看一下官方文档的介绍,将整数转为二进制类矩阵
这里的类向量(整数)就是我们输入的rand里面的一个个元素。也就是说,num_class指定了多少种类,一般这里的种类是大于或者等于我们输入的数组y中整数的上限的。例如我们rand中设置了low=3,说明rand有三种取值,0,1,2。我们设置num_class=10,这个超过了3(取值种类),说明可以应用。我们使用代码y_train = utils.to_categorical(rand, num_classes=10)。会将rand矩阵扩展为num_class列,而行数不变的矩阵,其中每一行都会有num_class个元素,但是只有对应rand中元素数值的那位(位置)才是1,表示生效,其他都是0.
例如:我们输入矩阵,如下
[[0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]]
第一行的2号位(下标从0开始)为1,说明整数为2,我们看rand:
[[2]
[2]
[0]
[1]
[2]
[1]
[2]
[2]
[0]
[1]]
发现确实是2。接下来就以此类推即可
如果我们设置num_class过小会怎么样:
可以发现数组越界,毕竟我们需要至少三种类型,然而只提供了两种。显然不够表示的。即我们至少需要为num_class=3
这样才可以(这里数据我把rand的值换了)
新的rand如下,可以发现生效位置和数值一一对应。
综上,就是将待转化的整数(元素)转为向量,让其整数通过num_class控制转为one-hot生效编码。