to_categorical(y, num_classes=None)
将类别向量(从0到nb_classes的整数向量)映射为二值类别矩阵, 用于应用到以categorical_crossentropy
为目标函数的模型中.
to_categorical就是将类别向量转换为二进制(只有0和1)的矩阵类型表示。其表现为将原有的类别向量转换为独热编码的形式。
1、先上代码看一下效果:
from keras.utils.np_utils import *
#类别向量定义
b = [0,1,2,3,4,5,6,7,8,9]
#调用to_categorical将b按照10个类别来进行转换
b = to_categorical(b, 10)
b
array([[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., 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., 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., 0., 0., 1.]], dtype=float32)
注意:在调用to_categorical时给了两个参数,一个是向量b,另外一个是要求其按照10个类别来生成独热编码。
如果将代码改为下面这样
#此处只有4个数据类型
c = [0,1,2,3]
c = to_categorical(c) #这里并没有给出类型参数4
c
其运行结果为:
array([[1., 0., 0., 0.], [0., 1., 0., 0.], [0., 0., 1., 0.], [0., 0., 0., 1.]], dtype=float32)
也就是如果我们不给出第二个参数,该方法会自动根据输入向量判断类型
2、通过手写数字识别来介绍一下:
from keras import layers
from keras.utils import to_categorical
import tensorflow as tf
import numpy as np
首先将MNIST数据集加载到keras中
from keras.datasets import mnist
这个数据集分为训练集和测试集
(train_images,train_labels),(test_images,test_labels)=mnist.load_data()
看一下训练集中数据量
train_images.shape
Out[4]:(60000, 28, 28)
训练集标签的数据
train_labels.shape
(60000,)
train_labels
array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
训练集的标签
train_labels=to_categorical(train_labels)
train_labels.shape
(60000, 10)
注意:上一步中,调用to_categorical()时,我们只给出了一个向量参数train_labels,并没有告诉它需要分为几个类型,但是它最后自动根据结果生成10个类型
再来看看标签
train_labels
array([[0., 0., 0., ..., 0., 0., 0.],
[1., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 1., 0.]], dtype=float32)