keras框架的to_categorical方法

在阅读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:intint 元组,可选
表示给定形状。默认值为 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生效编码。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值