1.4 Karas

Keras是一个高级别的Python神经网络框架,能在TensorFlow或者Theano上运行。Keras的作者、谷歌AI研究员Francois Chollet宣布了一条激动人心的消息,Keras将会成为第一个被添加到TensorFlow核心中的高级别框架,这将会使Keras变成Tensorflow的默认API。

Keras的特点是:

❑ 可以快速简单地设计出原型。

❑ 同时支持卷积网络和循环网络,以及两者的组合。

❑ 支持任意的连接方案(包括多输入和多输出)。

Keras的在线文档内容非常丰富,地址为:

        https://keras.io/

1.安装

Keras的安装非常简便,使用pip工具即可:

        pip install keras

如果需要使用源码安装,可以直接从GitHub上下载对应源码:

        https://github.com/fchollet/keras

然后进入Keras目录安装即可:

        python setup.py install

2.使用举例

以识别MNIST数据集为例,关于MNIST数据集的详细介绍请参考本书第5章。本章主要是给大家概要介绍如何使用Keras。

Keras自带了MNIST数据集,使用mnist.load_data()加载即可:

        # the data, shuffled and split between train and test sets
        (x_train, y_train), (x_test, y_test) = mnist.load_data()

MNIST中的图片大小为28× 28的矩阵,为了处理方便,把28× 28的矩阵转换成长度为784的向量:

        x_train = x_train.reshape(60000, 784)
        x_test = x_test.reshape(10000, 784)
        x_train = x_train.astype('float32')
        x_test = x_test.astype('float32')
        x_train /= 255
        x_test /= 255

图片识别的结果是0~9这10个数字。通常神经网络算法在处理时,习惯将输出以独热编码的形式展现,即所谓One-Hot编码,又称“一位有效编码”。其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。比如以二分类问题为例,结果为真表示为1,反之为0;使用独热编码,结果为真表示为10,反之为01。在Karas中可以使用keras.utils.to_categorical很方便地进行转换:

        # convert class vectors to binary class matrices
        y_train = keras.utils.to_categorical(y_train, num_classes)
        y_test = keras.utils.to_categorical(y_test, num_classes)

下面是整个环节的重点,构造一个隐藏层为2层,每层节点数分别为512、512,输出层节点数为10的多层感知机,使用Dense函数即可完成构造全连接网络的工作,其中第一层需要定义输入数据的形状,具体定义方式在input_shape属性指定。为了避免过拟合,每层之间使用Dropout函数进行部分丢失处理,适度的丢失数据不会影响分类识别效果,就好比识别一张照片时适度遮住一部分,不会影响分类识别结果:

        model = Sequential()
        model.add(Dense(512, activation='relu', input_shape=(784, )))
        model.add(Dropout(0.2))
        model.add(Dense(512, activation='relu'))
        model.add(Dropout(0.2))
        model.add(Dense(10, activation='softmax'))

完成多层感知机的结构定义后,就可以使用compile函数“编译”整个网络,让其工作:

        model.summary()
        model.compile(loss='categorical_crossentropy',
                      optimizer=RMSprop(),
                      metrics=['accuracy'])

整个训练过程需要定义训练数据集和测试数据集,同时定义训练的轮数,通常认为训练轮数为5~20比较合适,轮数太少训练不充分,轮数太多则训练时间过长:

        history = model.fit(x_train, y_train,
                        batch_size=batch_size,
                        epochs=epochs,
                        verbose=1,
                        validation_data=(x_test, y_test))

最后评估整个训练的效果,经过20轮训练,准确率为98.12%:

        score = model.evaluate(x_test, y_test, verbose=0)
        print('Test loss:', score[0])
        print('Test accuracy:', score[1])

输出结果为:

        Epoch 20/20
        60000/60000 [==============================] -11s - loss: 0.0201- acc: 0.9950-
            val_loss: 0.1224- val_acc: 0.9812
        ('Test loss:', 0.12236141463853964)
        ('Test accuracy:', 0.98119999999999996)