作者:马丁·海勒
编译:码上打卡团队
虽然深度神经网络风靡一时,但主要框架的复杂性已成为新机器学习用户使用的障碍。已经提出了几种用于构建神经网络模型的改进和简化的高级API的建议,所有这些建议从整体看起来相似但在仔细检查时显示出差异。
Keras是领先的高级神经网络API之一。它是用Python编写的,支持多个后端神经网络计算引擎。
Keras和TensorFlow
鉴于TensorFlow项目已采用Keras作为即将推出的TensorFlow 2.0版本的高级API,Keras看起来是赢了。在本文中,我们将探讨Keras的原理和实现,着眼于理解为什么它是对低级深度学习API的改进。
即使在TensorFlow 1.12中,官方的TensorFlow入门教程也使用了TensorFlow中嵌入的高级Keras API:tf.keras。相比之下,TensorFlow Core API需要使用TensorFlow计算图,张量,操作和会话,当您刚刚开始使用TensorFlow时,其中一些很难理解。主要是在调试时,使用低级TensorFlow Core API有一些优点,但幸运的是,您可以根据需要混合使用高级和低级TensorFlow API。
Keras原则
Keras的创建是为了用户友好,模块化,易于扩展,并与Python一起使用。API是“为人类而不是机器设计的”,并且“遵循减少认知负荷的最佳实践”。
神经层,成本函数,优化器,初始化方案,激活函数和正则化方案都是独立模块,您可以将它们组合在一起以创建新模型。新模块很容易添加,作为新的类和函数。模型在Python代码中定义,而不是单独的模型配置文件。
为什么选择Keras?
使用Keras的最大原因源于其指导原则,主要是关于用户友好的原则。除了易于学习和简化模型构建之外,Keras还具有广泛采用的优势,支持广泛的生产部署选项,与至少五个后端引擎(TensorFlow,CNTK,Theano,MXNet和PlaidML)集成,并强烈支持多个GPU和分布式培训。此外,Keras还得到了谷歌,微软,亚马逊,苹果,Nvidia,优步等公司的支持。
Keras后端
Keras本身并不进行自己的低级操作,例如张量积和卷积; 它依赖于后端引擎。尽管Keras支持多个后端引擎,但其主要(和默认)后端是TensorFlow,其主要支持者是Google。Keras API打包在TensorFlow中的tf.keras中,如前所述,它将成为TensorFlow 2.0的主要TensorFlow API。
要更改后端,只需编辑$HOME/.keras/keras.json文件并指定其他后端名称,例如theano或CNTK。或者,您可以通过KERAS_BACKEND在shell中或使用os.environ["KERAS_BACKEND"]属性在Python代码中定义环境变量来覆盖已配置的后端。
Keras型号
该模型是Keras的核心数据结构。Keras中有两种主要的模型类型:Sequential模型,以及Model与功能API一起使用的类。
Keras顺序模型
该Sequential模型是层的线性堆栈,并且可以非常简单地描述层。以下是Keras文档中的一个示例,该文档用于model.add()在Sequential模型中定义两个密集层:
import keras
from keras.models import Sequential
from keras.layers import Dense
#注释:使用add方法在用Dense层创建Sequentials模型
model = Sequential()
#Dense 实现步骤:
# output = activation(dot(input, kernel) + bias)
#单位是层的输出空间的维数,等于隐藏单位的数量
# 激活和丢失函数可以由字符串或类指定
model.add(Dense(units=64, activation='relu', input_dim=100))
model.add(Dense(units=10, activation='softmax'))
#编译方法配置模型的学习过程
model.compile(loss='categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
#fit方法做批量训练
# x_train和y_train是Numpy数组,就像Scikit(一个学习API)
model.fit(x_train, y_train, epochs=5, batch_size=32)
#evaluate方法为训练的模型计算丢失函数和矩阵
loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128)
#predict方法为输入的数据执行训练的模型,输出结果
classes = model.predict(x_test, batch_size=128)
上面代码中的注释值得一读。还有一点值得注意的是,与低级TensorFlow API相比,实际代码中有多少。每个层定义需要一行代码,编译(学习过程定义)需要一行代码,拟合(训练),评估(计算损失和度量),以及预测训练模型的输出每行需要一行代码。
Keras功能API
Keras Sequential模型很简单,但在模型拓扑中受到限制。所述Keras功能API是用于与共享层创建复杂的模型,如多输入/多输出模式,有向非循环图(DAG),和模型是有用的。
功能API使用与Sequential模型相同的层,但在将它们组合在一起时提供了更大的灵活性。在功能API中,首先定义图层,然后创建模型,编译它,然后拟合(训练)它。评估和预测与Sequential模型基本相同,因此在下面的示例代码中已省略。
from keras.layers import Input, Dense
from keras.models import Model
# 这边返回一个张量
inputs = Input(shape=(784,))
# 一个层实例在一个张量时是可调用的,然后返回一个张量
x = Dense(64, activation='relu')(inputs)
x = Dense(64, activation='relu')(x)
predictions = Dense(10, activation='softmax')(x)
# 这里创建一个包括输入层和三个Dense层
model = Model(inputs=inputs, outputs=predictions)
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.fit(data, labels) # starts training
Keras层
在前面的例子中,我们只使用了Dense图层。Keras有多种预定义的图层类型,还支持编写自己的图层。
核心层包括Dense(点积加偏差),Activation(传递函数或神经元形状),Dropout(在每次训练更新时随机将输入单位的一部分设置为0以避免过度拟合),Lambda(将任意表达式包装为Layer对象),以及其他几个。卷积层(使用滤波器创建要素图)从1D到3D运行,包括最常见的变体,例如每个维度的裁剪和转置卷积层。2D卷积受到视觉皮层功能的启发,通常用于图像识别。
池(缩减)层从1D到3D运行并包括最常见的变体,例如最大和平均池。局部连接的层就像卷积层一样,除了权重是非共享的。循环层包括简单(完全连接的重复),门控,LSTM等; 这些对于语言处理以及其他应用程序非常有用。噪声层有助于避免过度拟合。
Keras数据集
Keras通过keras.datasets课程提供了七个常见的深度学习样本数据集。这包括cifar10和cifar100小彩色图像,IMDB电影评论,路透社新闻专题,MNIST手写数字,MNIST时尚图片和波士顿房价。
Keras应用程序和示例
Keras还提供十种着名的模型,称为Keras应用程序,预先针对ImageNet:Xception,VGG16,VGG19,ResNet50,InceptionV3,InceptionResNetV2,MobileNet,DenseNet,NASNet,MobileNetV2TK。您可以使用它们来预测图像的分类,从中提取特征,并在不同的类集上微调模型。
顺便说一句,微调现有模型是加速培训的好方法。例如,您可以根据需要添加图层,冻结基础图层以训练新图层,然后解冻一些基础图层以微调培训。您可以通过设置冻结图层layer.trainable = False。
该Keras实例库包含超过40个样本模型。它们涵盖了视觉模型,文本和序列以及生成模型。
部署Keras
Keras模型可以部署在广泛的平台上,可能比任何其他深度学习框架都要多。这包括iOS,通过CoreML(Apple支持); Android,通过TensorFlow Android运行时 ; 在浏览器中,通过Keras.js 和 WebDNN ; 在Google Cloud上,通过 TensorFlow-Serving ; 在Python webapp后端 ; 在JVM上,通过DL4J模型导入 ; 并在Raspberry Pi上。
要开始使用Keras,请阅读文档,查看代码存储库,安装TensorFlow(或其他后端引擎)和Keras,并试用Keras Sequential模型的入门教程。从那里你可以进入其他教程,并最终探索Keras示例。