本文将简要介绍Keras的功能特点,使用Keras构建模型一般流程的6个步骤,以及使用Keras处理mnist分类问题的一个简单范例。
一,Keras简介
Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow,Theano 或者 CNTK, MXNet 作为后端运行。 Keras 具有以下优势: 简单易用:Keras是为人类而不是为机器设计的 API。它把用户体验放在首要和中心位置。Keras遵循减少认知困难的最佳实践,它提供一致且简单的 API,将常见用例所需的用户操作数量降至最低,并且在用户错误时提供清晰和可操作的反馈。 功能强大:Keras同时支持卷积神经网络和循环神经网络,以及两者的组合,它可以在CPU和GPU上无缝运行。Keras不仅提供了构建和训练神经网络模型的高级功能,还提供了模型结果可视化的工具,以及常见的图像和文本数据的预处理工具,另外Keras中还包括一些常用的玩具数据集和一些著名的已经训练好的神经网络模型。 高度灵活:用户可以使用Keras的函数式API构建任意结构的神经网络,如多输入多输出结构,残差网络,Inception网络等。通过自定义层和自定义模型,用户可以实现高度定制化的功能。利用Keras的后端backend提供的一些函数用户甚至可以从底层开始实现任意模型。 总之,这几乎是一个无懈可击的封装,集极致的体验,强大的功能,无限的灵活性于一身。 这就是Keras,你恰好发现了她! 目前Keras是github排名第二的开源深度学习框架,也是Kaggle竞赛中使用人数最多的神经网络框架。
二,使用流程
使用Keras进行神经网络实验的一般流程包括以下6个步骤。其中准备数据,构建模型和训练模型是必选的3个步骤。 1,准备数据: 可以从keras的dataset导入玩具数据集,也可以导入外部数据集,并使用图像,文本,序列等数据预处理工具进行数据预处理。当数据规模较大时,需要使用Sequence等工具构建数据管道以备在训练过程中并行读取。 2,构建模型 可以使用以下3种方式构建模型:使用Sequential按层顺序构建模型,使用函数式API构建任意结构模型,继承Model基类构建自定义模型。 模型由层layer组成,keras中有许多已经定义好的层,用户可以使用backend函数定义Lambda匿名层,此外用户也可以继承Layer层基类构建自定义层。 另外,用户也可以将application中已经训练好的模型加载进来,对其进行微调或者将其部分结构作为模型的一部分,模型本身也可以被看成一个层。 构建完模型后,需要用compile方法来编译模型,指定优化器,目标函数,评估指标,以及回调函数。 可以用summary方法来查看模型的结构和参数数量。也可以用plot_model方法来可视化模型的结构图。 如果需要使用tensorboard来对模型结构图及训练过程进行可视化,可以调用tensorboard回调函数。 3,训练模型 一般情况下可以用模型的fit方法训练模型,当数据集较大时,应当使用内存友好的fit_generator方法训练模型,如果需要细粒度的自定义训练过程,可以用train_on_batch逐批次地训练模型。 如果需要使用GPU训练模型,需要安装CUDA和cuDNN以支持相应计算,并安装tensorflow-gpu版本,则可以无缝切换到GPU运行。 如果需要使用多个GPU训练模型,可以使用keras.utils.multi_gpu_model创建支持多个GPU同时训练的模型。 4,评估模型 在通常情况下,训练模型时候指定验证集就可以在训练过程中输出模型的在训练集和验证集的损失和评估指标。然后可以用matplotlib将结果可视化,也可以利用回调函数在tensorboard中进行可视化。如果需要自定义评估指标,可以利用backend接口进行编写。 在模型训练完成后,可以用evaluate方法对模型进行评估,当数据集较大时,使用对内存友好的evaluate_generator方法评估模型,如果需要细粒度的评估,可以用test_on_batch在一个批次上评估模型。 5,使用模型 一般情况下使用模型的predict方法进行预测,当数据集较大时,使用predict_generator方法进行预测。 6,保存模型 keras可以用模型的save方法保存模型的结构和权重到.h5文件,也可以用save_weight方法只保存模型的权重到.h5文件,也可以用to_json或者to_yaml方法只保存模型的结构到json或者yaml文件。
三,mnist分类范例
我们以mnist手写数字识别数据集为例介绍分类范例。这是一个多分类问题。
代码语言:javascript复制import keras
import tensorflow as tf
from keras import backend as K
1,导入数据
代码语言:javascript复制from keras import datasets
# 从自带数据集载入数据
(x_train, y_train), (x_test, y_test) = datasets.mnist.load_data()
# 将数据reshape并缩放
x_train = x_train.reshape((-1, * ))
x_train = x_train.astype('float32') /
x_test = x_test.reshape((-1,*))
x_test = x_test.astype('float32') /
from keras import utils
# 将标签转换为onehot编码
y_train = utils.to_categorical(y_train,num_classes= )
y_test = utils.to_categorical(y_test,num_classes= )
print('x_train.shape:',x_train.shape)
print('y_train.shape:',y_train.shape)
print('x_test.shape:',x_test.shape)
print('y_test.shape:',y_test.shape)
2,构建模型
代码语言:javascript复制from keras import models,layers
model = models.Sequential()
model.add(layers.Dense(,activation = 'relu',input_shape=( * ,)))
model.add(layers.Dense(,activation = 'softmax' ))
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.summary()
3,训练模型
代码语言:javascript复制history = model.fit(x_train,y_train,
epochs = ,
batch_size = ,
validation_data =(x_test,y_test))
4,评估模型
代码语言:javascript复制import matplotlib.pyplot as plt
%matplotlib inline
%config InlineBackend.figure_format = 'svg'
acc = history.history['acc']
val_acc = history.history['val_acc']
epochs = range(, len(acc) )
plt.plot(epochs, acc, 'bo', label='Training accuracy')
plt.plot(epochs, val_acc, 'b', label='Validation accuracy')
plt.title('Training and validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
5,使用模型
6,保存模型
代码语言:javascript复制# 保存模型结构及权重
model.save('my_model.h5')
del model
# 恢复模型结构及权重
model = models.load_model('my_model.h5')
model.evaluate(x_test,y_test)