Keras支持Python 2.7-3.6版本,且安装前要求预装TensorFlow、Theano、Microsoft-CNTK中的至少一个
。其它可选的预装模块包括:h5py,用于将Keras模型的保存为
HDF
文件;cuDNN,用于
GPU
计算;PyDot,用于模型绘图
。Keras可以通过PIPy、
Anaconda
安装,也可从
GitHub
上下载源代码安装
:
pip install keras
conda install keras
Keras的神经网络API是在封装后与使用者直接进行交互的API组件,在使用时可以调用Keras的其它组件。除数据预处理外,使用者可以通过神经网络API实现
机器学习任务中的常见操作,包括
人工神经网络的构建、编译、学习、评估、测试等
Keras属性与方法
Keras支持序列化模型和函数化模型,且二者具有一定数量的公有
属性(attribute)和方法(method)。其中的公有属性包括layers、inputs、outputs,能够以Python列表的形式返回模型信息
:model.layers返回一个列表,列表中包含该模型内所有已创建的层对象(参见“层API”),例如keras.layers.Dense
model.inputs返回一个列表,列表包含该模型输入端接收的数据类型,例如以Tensorflow为后台时返回tf.Tensor
model.outputs与model.inputs相同但返回输出端信息。
Keras模型的公有方法主要与模型权重和结构有关,这里分别介绍如下:
model.summary返回该模型的结构信息、总参数量、可学习参数量等信息。
model.get_config返回一个字典,字典包含该模型所有对象的结构和编译信息。Keras可以通过该信息建立新模型。
model.get_weights返回一个列表,列表中每个成员都是NumPy数组形式的模型权重,列表的顺序为输入端到输出端。
model.set_weights(pre_trained_w)指定模型的所有权重,指定的权重必须与model.get_weights返回的权重大小一致。
model.to_yaml将Keras模型的结构输出为yaml文件,不包含模型权重。输出完成后,Keras模型可以由yaml文件导入。
model.save_weights(filepath)将Keras模型的权重保存为HDF5文件,运行时指定文件路径filepath。
model.load_weights(filepath, by_name=False)由HDF5文件导出权重到模型。model.load_weights通常只接受model.save_weights输出的文件,在接收其他来源的文件时,需要指定by_name=True并要求HDF5的变量名与模型层对象的名字相同。
序列化模型(keras.models.Sequential)
Keras的序列化模型是由其API中层对象(参见“层API”)堆叠得到的神经网络模型
。序列化模型有两种定义方式,一种是运行keras.models.Sequential时由列表指定所有的层对象,另一种是在运行时不指定层API,而是对Sequential类使用model.add添加层对象,这里给出使用的例子:
import keras
# 定义一个8-16-2的感知器(方法一)
model = keras.models.Sequential([keras.layers.Dense(16, activation='relu', input_shape=(8,)),
keras.layers.Dense(2, activation='sigmoid')])
# (方法二)
model = keras.models.Sequential()
model.add(keras.layers.Dense(16, activation='relu', input_shape=(8,)))
model.add(keras.layers.Dense(2, activation='sigmoid'))
序列模型不显式定义输入层,因此其第一个层对象要求指定输入数据的大小,例子中使用了参量input_shape,也可等价地使用参量input_dim
。
函数化模型(keras.models.Model)
Keras的函数化模型也被称为functional API,其功能是将一个张量指定为输入,另一个张量指定为输出,并将与输入、输出张量之间存在连接的节点(层对象)组合成神经网络模型
。这里提供一个函数化模型的使用例子。
import keras
# 定义一个8-16-2的感知器
IN = keras.layers.Input(shape=(8,))
HIDDEN = keras.layers.Dense(16, activation='relu')(IN)
OUT = keras.layers.Dense(2, activation='sigmoid')(HIDDEN)
model = keras.models.Model(inputs=IN, outputs=OUT)
相比于序列化模型,函数化模型显示定义了隐含层的张量,因此可以更容易地搭建非序列化的模型,具有更好的可扩展性。此外,Keras的函数化模型支持自定义的子类
继承
,但在定义子类时,模型的拓扑结构由Keras的Python代码而不是层对象的静态图指定,因此一部分基于模型静态图的方法在子类继承后无法使用
Keras使用模型
编译(model.complie)
Keras模型的编译由model.compile实现,运行时可将Keras代码翻译为后台代码以执行学习、评估等后续操作。编译可以指定学习组件(参见“学习与优化API”),其使用格式如下
:
model.compile(optimizer, loss=None, metrics=None, loss_weights=None,
sample_weight_mode=None, weighted_metrics=None, target_tensors=None)·
格式中各参量的含义和调用方法如下
:
optimizer为优化器、loss为损失函数、metrics为评价函数,可以按列表使用多个评价。
loss_weights为损失权重,可以在多输出的模型中对不同输出所对应的损失叠加不同的权重系数,要求提供与模型损失相对应的列表或张量。
sample_weight_mode是进行样本赋权的参量,默认为None,表示在model.fit中进行一维赋权;在编译时间序列模型时,可选择sample_weight_mode="temporal",此时模型对时间序列样本(按时间步)进行二维赋权。
weighted_metrics和metrics的用法相同,在不指定样本赋权时等价于metrics,在指定了样本赋权时会对赋权样本的学习进行评价。
target_tensor:较少使用的参量,Tensorflow后台的Keras默认为学习目标分配张量占位符,但使用者可以调用该参量显式指定学习目标的张量。
除上述参量外,根据后台的不同,model.compile也可以将其它参量和关键字传递至keras.backend.function或tf.Session.run。
学习(model.fit、model.fit_generator)
模型编译完成后可以使用model.fit或model.fit_generator进行学习,其使用格式如下
:
model.fit(x=None, y=None, verbose=1, callbacks=None,
epochs=1, initial_epoch=0, class_weight=None
steps_per_epoch=None, batch_size=None,
validation_split=0.0, validation_data=None,
validation_steps=None, validation_freq=1,
shuffle=True, sample_weight=None)
model.fit_generator(generator,...,
max_queue_size=10, workers=1, use_multiprocessing=False)
# ... 表示与model.fit相同的关键字
model.fit和model.fit_generator的使用格式包含一些共有的参量,其含义和调用方法如下
:
verbose表示在学习时显示进度条和当前评估结果,默认为开启。
callback是回馈器选项(参见“回馈器”)。
epochs是学习的纪元数,即对所有学习样本迭代的次数。
initial_epoch表示开始学习时的纪元数,如果没有加载先前的学习权重则默认为从0开始。
class_weight是在分类问题中进行类别赋权的参量,即对不同分类的学习目标使用不同的权重。calss_weight的输入为一个字典,变量名为类别名,内容为权重,例如对二元分类,类别名通常为“0”和“1”。
除上述共有参量外,对model.fit,其余参量的含义和调用方法如下:
x表示输入特征,y表示学习目标,batch_size表示分批学习时单个批次的样本数。steps_per_epoch表示参与学习的批次数,默认值None表示总样本数除以单个批次的样本数,即可允许的最大批次数。
validation_split表示样本中用于模型验证(validation)的比例,这部分数据会按比例随机选取且不参与学习。
validation_data接收一个包含或(x, y)或(x, y, sample_weight)的Python元组用于学习时的验证。
validation_freq仅在调用了validation_split或validation_data时使用,表示模型验证的频率,默认值为1,表示每个纪元都进行验证。validation_freq也接收列表,列表中的元素表示进行模型验证的纪元数,例如[1, 5, 10]表示在第1、5、10个纪元进行模型验证。
validation_steps仅在调用了steps_per_epoch后使用,表示参与模型验证的批次数。
shuffle是数据的洗牌选项,仅在调用了steps_per_epoch=None时使用,默认值为True,表示完全洗牌,此外也可选False和batch,后者表示仅在一个批次的样本内洗牌。
sample_weight是对样本赋权的参量,通常不和类别赋权的参量calss_weight一起调用。在model.compile中定义sample_weight_mode=None时,sample_weight接收一个1维NumPy数组,大小与样本总数相同;在定义sample_weight_mode=“temporal”时,calss_weight接收一个二维数组,按行表示每个样本在不同时间步的权重,即数组大小为(sample, timestep)。
对model.fit_generator,其余参量的含义和调用方法如下:
generator表示生成器(参见“通用工具”),返回输入特征、学习目标和样本权重,不返回样本权重时默认均等赋权。
steps_per_epoch的含义与model.fit相同,但默认值为生成器的内部方法__len__(self)的返回值。
validation_data的含义与model.fit相同,接收相同的输入,但也接收验证数据的生成器。
validation_step仅在validation_data接收生成器时使用,表示参与模型验证的批次数。
validation_freq仅在调用了validation_data时有效,表示进行模型验证的频率,使用方法与model.fit相同。
max_queue_size接收一个整数,表示生成器的最大队列数。
use_multiprocessing默认为False,表示不使用基于线程的流程。在计算系统具有多线程能力且生成器支持Python的多线程处理框架,即支持pickle操作时,可以选择True。
workers表示工作的线程数,默认为0,表示仅在主线程运行,在use_multiprocessing=True时可选大于0的整数。
评估(model.evaluate、model.evaluate_generator)
在模型完成学习后,Keras提供model.evaluate和model.evaluate_generator进行模型评估,二者的使用格式如下
:
model.evaluate(x=None, y=None, batch_size=None, verbose=1,
sample_weight=None, steps=None, callbacks=None)
model.evaluate_generator(generator, ...
max_queue_size=10, workers=1, use_multiprocessing=False)
# ... 表示与model.evaluate相同的关键字
测试(model.predict、model.predict_generator、model.predict_on_batch)
Keras模型可以通过model.predict、model.predict_generator和model.predict_on_batch进行测试,其使用格式如下
:
model.predict(x, batch_size=None, verbose=0, steps=None, callbacks=None)
model.predict_generator(generator, ...,
max_queue_size=10, workers=1, use_multiprocessing=False)
model.predict_on_batch(x)
Keras的层API包含一些共有方法,这些方法与给定层对象的结构和权重更新有关
:
layer.get_weights返回一个列表,列表中的元素为NumPy数组形式的,该层对象的权重矩阵。
layer.set_weights(weights) 指定一个层对象的权重,指定的权重必须与layer.get_weights返回的权重大小一致。
layer.get_config: 返回一个字典,字典包含该层对象的结构信息。Keras可以通过该信息对层进行重建。
layer.get_input_at(node_index) 按节点的索引返回层对象的输入张量
layer.get_output_at(node_index) 按节点的索引返回层对象的输出张量
layer.get_input_shape_at(node_index) 按节点的索引返回层对象输入张量的大小
layer.get_output_shape_at(node_index) 按节点索引返回层对象输出张量的大小
当一个层对象仅有一个节点,即没有层对象的合并时,上述方法按属性的形式使用
:
layer.input
layer.output
layer.input_shape
layer.output_shape
作为进一步说明,Keras中所有的层(子类),除输入层外都
继承自keras.engine.base_layer.Layer类,在该类中,层的“节点”是输入和输出张量的连结。例如在顺序连结的Keras模型中,每个层对象都只有一个节点,但包含共享输入或输出的层对象,例如keras.layers.concatenate按张量映射的顺序,包含了多个节点
Keras核心层
输入层(keras.layers.Input)
Keras的输入层继承自keras.engine.input_layer,是一个后台张量,例如tf.Tensor的实现。由Keras的输入层子类创建层对象的方式为
:
keras.layers.Input(shape=None, batch_shape=None,
name=None, dtype=None, sparse=False, tensor=None)
格式中各参量的含义和调用方法如下
:
shape和batch_shape表示张量的大小,接收Python元组,其中shape不指定数据批次的长度。
name接收一个字符串,表示该输入层的名称
dtype按字符形式接收张量的数据类型,例如‘float32’、'int32'等
spare和tensor表示输入层返回张量的类型,前者表示是否返回稀疏张量,后者取默认值时创建一个张量占位符,接收了指定张量时返回数值到该指定张量。
全连接层(keras.layers.Dense)
Keras内部全连接层对象的创建方式为
:
keras.layers.Dense(units, activation=None, use_bias=True,
kernel_initializer='glorot_uniform', bias_initializer='zeros',
kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None,
kernel_constraint=None, bias_constraint=None)
格式中各参量的含义和调用方法如下
:
activation表示该全连接层使用的激活函数,接收一个激活函数对象,例如keras.activations.sigmoid,也可接收关键字,例如'sigmoid',使用关键字时该激活函数类的参量取默认值。默认值None表示不使用激活函数。全连接层中激活函数的计算在权重计算完成后进行。
use_bias接收一个逻辑变量,默认值为True,表示该全连接层的权重矩阵中包含一个偏差量,偏差量和其余权重一起在学习时进行更新。
kernel_initializer表示该全连接层权重的初始化方法,接收一个keras.initializers对象或其关键字,默认值为keras.initializers.glorot_normal(seed=None),从一个0均值的正态分布中取随机数进行权重初始化。
bias_initializer在use_bias=True时可用,接收一个偏差量的初始化器对象或其关键字,默认值为keras.initializers.Zeros,表示按0值张量初始化。
kernel_regularizer和bias_regularizer表示该全连接层中权重矩阵的正则化方法,接收一个正则化器对象,默认值None表示不使用正则化,使用正则化时可用的对象包括keras.regularizers.l1、keras.regularizers.l2和keras.regularizers.l1_l2。
activity_regularizer表示该全连接层输出的正则化,调用方法与kernel_regularizer和bias_regularizer相同。
kernel_constraint和bias_constraint表示该全连接层中权重矩阵使用的参数限制方法,接收一个参数限制器,默认值为None,表示不限制参数,其它可用对象包括keras.constraints.NonNeg、keras.constraints.UnitNorm和keras.constraints.MinMaxNorm。
激活层(keras.layers.Activation)
Keras支持创建独立的激活层对象,其创建方式为
:
keras.layers.Activation(activation)
格式中的activation表示一个Keras的激活函数对象、例如keras.activations.sigmoid。将激活层前置于全连接层时可以实现神经网络中的预激活(pre-activation)操作。激活层和全连接层中的activation参量不产生冲突,同时使用时会分别进行激活函数计算
。此外Keras也可以直接从层API创建激活层,参见“特殊激活层”。
随机失活层
Keras支持随机连接失活和随机空间失活,可用的子类包括Dropout、SpatialDropout1D、SpatialDropout2D和SpatialDropout3D,其创建方式为
:
keras.layers.Dropout(rate, noise_shape=None, seed=None)
keras.layers.SpatialDropout1D(rate) # same for 2D & 3D
格式中rate接收一个0和1之间的浮点数,表示随机失活的比率。Dropout中noise_shape表示随机失活对张量各个维度的操作,例如对输入张量(t,x,y),给定noise_shape=(1,x,y)时,输入张量(x,y)维度的随机失活在t维不变。默认值None表示完全的随机连接失活
。
Keras中的随机空间失活,例如SpatialDropout2D会随机归零整个通道,例如对4维张量(t,x,y,c),2维的随机空间失活会随机选择某个c维和t维上所有的(x,y)元素归零
。
输出正则化层(keras.layers.ActivityRegularization)
Keras提供了独立的输出正则化层子类,并支持L1和L2正则化方法,其创建方式为
:
keras.layers.ActivityRegularization(l1=0.0, l2=0.0)
格式中的l1和l2接收对应的正则化系数。输出正则化层和全连接层中的activity_regularizer参量不产生冲突,使用时会分别执行正则化操作
。
张量操作层
Keras在层API中提供了支持特定张量操作的层类。由于张量操作层所进行的操作均可以类比NumPy数组中的对应操作,因此这里仅对张量操作层进行简单介绍
:
keras.layers.Flatten可以将多维张量展开成1维张量,可类比numpy.flatten
keras.layers.Reshape和keras.layers.Permute可以调整张量的维度,可类比numpy.reshape和numpy.permute。
keras.layers.RepeatVector可以在新的维度复制张量,可类比numpy.repeat。
keras.layers.Lambda与Python中匿名函数类似,是一个通用的操作封装器。
keras.layers.Masking忽略张量中取值为给定值的元素,接近于numpy.ma.masked_where。
Keras卷积层与池化层
Keras内置了一系列1维至3维的卷积层和池化层子类用于搭建卷积神经网络,且作为特色地,加入了深度可分卷积、转置卷积、扩张卷积等较为复杂的构筑。另注意到,Keras中卷积层和池化层的“维度”是特征图的维度,即一个keras的2维卷积层对象的输入和输出都是4维张量,通常为(样本/批次, 特征图第1维, 特征图第2维, 通道)。在指定data_format时也可以为(通道, 特征图第1维, 特征图第2维, 样本/批次)
。
卷积层与深度可分卷积层
Keras包含1维至3维的卷积层,以及2维和3维的深度可分卷积层子类:Conv[1-3]D、SeparableConv[1,2]D。以2维情形为例,其对象的创建方式为
:
keras.layers.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid',
dilation_rate=(1, 1), activation=None, use_bias=True, data_format=None,
bias_initializer='zeros', kernel_initializer='glorot_uniform',
kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None,
kernel_constraint=None, bias_constraint=None)
keras.layers.SeparableConv2D(..., depth_multiplier=1,
depthwise_initializer='glorot_uniform', pointwise_initializer='glorot_uniform',
bias_initializer='zeros', depthwise_regularizer=None,
pointwise_regularizer=None, bias_regularizer=None, activity_regularizer=None,
depthwise_constraint=None, pointwise_constraint=None, bias_constraint=None)
# ... 表示Conv2D的共有参量
格式中共有参量的含义和调用方法如下
:
filters接收一个整数,表示该卷积层的卷积核个数,也被称为通道数。
kernel_size接收一个Python元组,表示每个卷积核的尺寸,例如对3x3的二维卷积核,kernel_size=(2, 2)。
strides接收一个Python元组,表示卷积步长。2维卷积核的默认值为(1, 1),表示单步卷积
padding是卷积核的0值填充选项,默认值'valid'表示不进行填充(即等效填充),输入'same'时使用相同填充。
dilation_rate是卷积核的扩张比率,2维卷积核的默认值为(1, 1),表示线性卷积,当使用扩张卷积时,元组的值通常大于1。按扩张卷积的定义,当扩张比率大于1时,卷积步长必须等于1,即strides=(1, 1)。
data_format是接收特征度维度顺序的参量,默认值None表示张量的第1维表示样本,最后1维表示通道,等价于输入"channels_last"。在张量的第1维表示通道时输入“channels_first”。
activation、use_bias、*_initializer、*_regularizer、*_constraint的调用方法参见keras.layers.Dense。
SeparableConv[1,2]D中参量的含义和调用方法如下
:
depth_multiplier接收一个整数,表示沿通道方向的空间卷积的可分度,默认值1表示完全可分,即每个通道独立进行空间卷积。
depthwise_initializer、depthwise_regularizer、depthwise_constraint接收深度可分卷积中空间卷积部分的初始化器、正则化器和参数限制器。
pointwise_initializer、pointwise_regularizer、pointwise_constraint接收深度可分卷积中单位卷积核的初始化器、正则化器和参数限制器。
极大池化、均值池化与全局池化层
Keras支持1维到3维的极大池化、均值池化和全局池化:MaxPooling[1-3]D、AveragePooling[1-3]D、GlobalMaxPooling[1-3]D、GlobalAveragePooling[1-3]D。以2维极大池化和全局极大池化为例,池化层对象的创建方式为
:
keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid',
data_format=None)
keras.layers.GlobalMaxPooling2D(data_format=None)
格式中pool_size接收一个Python元组,表示池化层感受野的大小,其余参量的调用方法与keras.layers.Conv2D相同。
转置卷积与反池化层
Keras包含2维和3维的转置卷积子类:Conv[2,3]DTranspose,以及1维至3维的反池化层子类:UpSampling[2,3]D。以2维情形为例,其创建方式为
:
keras.layers.Conv2DTranspose(filters, kernel_size, strides=(1, 1), padding='valid',
output_padding=None, dilation_rate=(1, 1), activation=None,
use_bias=True, data_format=None, kernel_initializer='glorot_uniform',
bias_initializer='zeros', bias_regularizer=None,
kernel_regularizer=None, activity_regularizer=None,
kernel_constraint=None, bias_constraint=None)
keras.layers.UpSampling2D(size=(2, 2), data_format=None, interpolation='nearest')
Conv2DTranspose的参量的含义和调用方法如下
:
output_padding接收一个整数或整数元组,表示转置卷积输出端的0值填充层数,其中接收元组时,对特征图各维度分别使用元组中整数指定的层数进行填充。注意到output_padding指定的整数必须小于步长。原因是转置卷积(或反卷积)可视为卷积的逆变换,因此output_padding在功能上是对卷积计算的“还原”。作为解释性的例子,100x100的特征图在通过3x3、步长为10、无填充的卷积核后,会输出为10x10的特征图,但由于步长取整的原因,95x95的特征图在通过该卷积核后也会得到10x10的特征图,因此使用转置卷积“还原”上述过程时需要指定output_padding以确保能还原到100x100的特征图尺寸。
参量filters、kernel_size、strides、padding、dilation_rate、data_format的调用方法与keras.layers.Conv2D相同。activation、use_bias、*_initializer、*_regularizer、*_constraint的含义和调用方可法参见keras.layers.Dense。
UpSampling2D中参量size表示反池化的放大系数,例如一个100x100特征图在经过size=(2, 2)的反池化后会输出200x200的特征图。keras.layers.UpSampling2D中的interpolation仅对Tensorflow后台有效,表示反池化的差值方法,默认值‘nearest’表示
最接近原则插值,也可接收'bilinear'表示
双线性插值
。裁剪和0值填充层
Keras支持创建2维和3维特征图的裁剪层对象:Cropping2D、Cropping3D;以及独立的1维至3维0值填充层对象:ZeroPadding1D、ZeroPadding2D、ZeroPadding3D,以2维情形为例,其创建方式分别为
:
keras.layers.Cropping2D(cropping=((0, 0), (0, 0)), data_format=None) # 裁剪
keras.layers.ZeroPadding2D(padding=(1, 1)) # 0值填充
参量cropping接收2维或3维元组,表示由特征图边缘向中心裁剪去除的像素个数,对多维元组,其顺序为((第1维左, 第1维右), (第2维左, 第2维右))以此类推。cropping也接收单个整数,表示对特征图的所有维度进行相同像素的裁剪
。参量中的padding表示特征图各维度上0值填充的层数。
Keras循环层与循环单元
Keras提供循环层和循环单元用于构建循环神经网络,二者是keras.engine.base_layer.Layer类的子类,属于层API的一部分,其中循环层是在功能上与其它层对象相当的构筑,可以直接堆叠得到神经网络模型;循环单元是循环层内对序列数据的每个时间步进行(系统)状态和输出进行处理的模块,一个循环层可以包含一个或多个循环单元
。
循环单元子类
Keras的循环单元子类包括简单循环单元(SimpleRNNCell)、长短期记忆单元(LSTMCell)、门控循环单元(GRUCell),其对应的子类实现方式如下:
简单循环单元的创建方式为
:
keras.layers.SimpleRNNCell(units, activation='tanh', use_bias=True,
kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal',
bias_initializer='zeros',
kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None,
kernel_constraint=None, recurrent_constraint=None, bias_constraint=None,
dropout=0.0, recurrent_dropout=0.0)
keras.layers.LSTMCell(recurrent_activation='hard_sigmoid',
unit_forget_bias=True, implementation=1, ...)
keras.layers.GRUCell(recurrent_activation='hard_sigmoid',
implementation=1, reset_after=False, ...)
# ... 表示SimpleRNNCell的共有参量
格式中3类循环单元共有的参量的含义和调用方法如下
:
units接收一个整数,表示输入序列的维度或序列特征的个数。
use_bias、bias_initializer、bias_regularizer、bias_constraint的含义和调用方可法参见keras.layers.Dense。
activation表示系统状态的激活函数,默认值为关键字'tanh',表示keras.activations.tanh
recurrent_initializer、recurrent_regularizer、recurrent_constrain是接收状态-状态权重的初始化器、正则化器和参数限制器的参量,使用方法可参见keras.layers.Dense,关键字'orthogonal'表示keras.initializers.Orthogonal。
kernel_initializer、kernel_regularizer、kernel_constrain是接收状态-输入权重的初始化器、正则化器和参数限制器的参量,使用方法可参见keras.layers.Dense。
droupout、recurrent_droupout接收0至1的小数,表示状态-状态权重和状态-输入权重的
随机失活比率。默认值0表示不进行随机失活操作。
格式中LSTMCell和GRUCell共有的参量的含义和调用方法如下
:
recurrent_activation表示LSTM或GPU门控的激活函数,默认值为关键字'hard_sigmoid',表示keras.activations.hard_sigmoid。
implementation是调整LSTM或GRU单元内部计算方案的关键字,默认值1表示将内部计算拆分为大量的小型矩阵计算,implementation=2表示将内部计算拆分为少量的大型矩阵计算。两种计算策略在不同的计算系统中有不同的执行效率。
对LSTMCell,unit_forget_bias是其控制遗忘门偏差量初始化的参量,默认值为True,表示将遗忘门偏差量的初始值设定为1.0。对GRUCell,reset_after=False表示在时序输入与权重矩阵相乘后使用复位门
。此外LSTM单元有对应的循环卷积单元子类
。
循环层子类
Keras的循环层子类包括一个可接收任意循环单元的子类:keras.layers.RNN,和预设了特定循环单元的子类:SimpleRNN、GRU、LSTM、LSTM2D
。不是一般性这里只对通用的子类进行介绍:
keras.layers.RNN(cell, return_sequences=False, return_state=False,
go_backwards=False, stateful=False, unroll=False)
格式中参量的含义和调用方法如下
:
cell接收循环单元子类,可以是Keras预提供的循环单元,也可以是自定义的循环单元,对后者,该对象需包含call、state_size、out_size等3个方法。接收多个循环单元时,循环单元对象按列表组织先后顺序。
return_sequences和return_state分别表示输出最后1个时间步的输出或所有时间步的输出,以及是否输出最后1个时间步的系统状态。
go_backwards表示是否允许在学习时反向输入序列。
stateful表示是在当前批次数据的学习中否保留上对一批次序列学习得到的权重。
unroll: 表示是否在学习中“展开”循环单元。“展开”表示循环单元会对所有时间步得到一个复制并按前馈结构进行学习。因为展开后的RNN不需要递归计算,因此以提高内存开销为代价加快了学习速度。展开通常仅在短序列输入时使用。
input_dim和input_length表示输入数据中单个时间步的维度和时间步的个数。
预设了特定循环单元的循环层子类包含了keras.layers.RNN的所有参量,以及对应循环单元的参量。
Keras层间合并
Keras提供了8个层子类用于隐含层的合并,按对应的张量操作方式包括:加Add、减Subtract、乘Multiply、取均值Average、取极大值/极小值Maximum/Minimum、拼接Concatenate、点乘Dot。当上述子类的名称为全小写时,即add、multiply等,表示该子类的函数化接口
。
层间合并子类的输入为一个列表,列表内按顺序包含需要合并的张量,这里对张量的拼接给出一个例子:
IN1 = keras.layers.Input(shape=(16,)) # 分支1
H1 = keras.layers.Dense(8, activation='relu')(IN1)
IN2 = keras.layers.Input(shape=(32,)) # 分支2
H2 = keras.layers.Dense(8, activation='relu')(IN2)# 使用函数化接口
M = keras.layers.concatenate([x1, x2])# 使用层间合并对象
M = keras.layers.Concatenate()([x1, x2])
model = keras.models.Model(inputs=[IN1, IN2], outputs=M)
Keras其它子类
除上述子类外,keras的层API还包含一些其它子类,这里将其列出并简要介绍:
keras.layers.BatchNormalization是对层对象的输出张量进行分批归一化的子类
。
keras.layers.LeakyReLU、PReLU、ELU、ThresholdedReLU、ReLU和Softmax是可以从层API直接创建的激活层子类
。
keras.layers.Bidirectional和keras.layers.TimeDistributed是层的封装器子类,以层对象为输入并为其赋予特定功能。其中Bidirectional仅接收循环层对象并赋予其双向连接,TimeDistributed接收所有隐含层对象并将该层的操作在一个维度“复制”
。
keras.GaussianNoise、GaussianDropout和AlphaDropout为层对象的输出张量混入噪声,其中GaussianNoise按加法混入噪声,GaussianDropout和AlphaDropout按乘法混入噪声
。
keras.layers.Embedding可以实现张量的嵌入操作
Keras优化器
Keras内置了7个可在反向传播算法框架内使用的优化器(keras.optimizers),这些优化器按keras.optimizers.Optimizer的子类进行封装,这里对优化器的名称和实现进行介绍
:
名称 | 对象 |
---|
均方差传播算法(RMSprop) | keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=None, decay=0.0) |
随机梯度下降算法(SGD) | keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False) |
自适应梯度下降算法(Adagrad) | keras.optimizers.Adagrad(lr=0.01, epsilon=None, decay=0.0) |
自适应学习速率算法(Adadelta) | keras.optimizers.Adadelta(lr=1.0, rho=0.95, epsilon=None, decay=0.0) |
自适应动量估计(Adam) | keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False) |
自适应最大阶动量估计(Adamax) | keras.optimizers.Adamax(lr=0.002, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0) |
Nesterov加速自适应动量估计(Nadam) | keras.optimizers.Nadam(lr=0.002, beta_1=0.9, beta_2=0.999, epsilon=None, schedule_decay=0.004) |
优化器包含共用参数,其中lr表示学习速率,接收大于0的浮点数、decay表示学习速率随纪元的递减,默认值为0,表示学习速率无递减、epsilon表示最小常数,默认值为keras.backend.epsilon。其余参数为各优化器可选的超参数
。
表格中优化器可以按关键字调用,关键字为小写的子类名称,例如keras.optimizers.Adam的关键字为'adam'。按关键字调用优化器时,其超参数取默认值
Keras的初始化器子类(keras.initializers)提供了在创建层对象(时需要指定的权重初始化方法
。所有的Keras初始化器都继承自keras.initializers.Initializer,通过对Initializer进行子类继承,也可以自定义初始化器。这里列出Keras可用的所有初始化器:
keras.initializers.Zeros、Ones、Constants按常量初始化权重。
keras.initializers.RandomNormal、RandomUniform、TruncatedNormal、he_uniform、lecun_uniform、glorot_uniform、he_normal、lecun_normal、glorot_normal、VarianceScaling生成随机数初始化权重
keras.initializers.Orthogonal、Identity按
正交矩阵和
单位矩阵初始化权重。
Keras正则化器
正则化器(keras.regularizers)类提供了神经网络学习的正则化操作,即在计算损失函数时考虑该层权重的范数。Keras的正则化器继承自keras.regularizers.Regularizer类,包括L1正则化、L2正则化和两者的线性叠加,共3个子类
:keras.regularizers.l1、l2、l1l2。注意到,正则化器中的正则化系数,是正则化项(而非经验风险项)相乘的系数。
Keras参数限制器
Keras中参数限制器(keras.constraints)类的功能是将神经网络权重的取值限定在一个范围内,防止神经网络在学习过程中出现个别高权重节点控制整体输出的情形出现;在特定问题下可使神经网络仅包含非负权重
。keras.constraints包含4个预设子类:MaxNorm、NonNeg、UnitNorm、MinMaxNorm,功能分别为限制权重极大值、限制负权重、权重(范数)归一化、权重0-1标准化
Keras回调函数
Keras的
回调函数(keras.callbacks)是一个特殊的类,其功能是在模型的学习过程中按条件触发给定的操作。Keras的回调函数预置了12个子类,也支持用户自定义的子类继承。一般地,回调函数对象在按列表的形式组织后可以在Keras神经网络API中进行调用:
# 定义并编译你的模型
callback_list = [callback1, callback2, callback3] # 定义回馈器
records = model.fit(..., callbacks=callback_list, ...) # 在模型学习时调用
记录与监控工具
Keras的内置回调函数中包含了一系列可用于记录和监控模型行为的子类:BaseLogger、CSVLogger、ProgbarLogger、History、RemoteMonitor、TensorBoard。其中BaseLogger和History在模型学习时会默认加载,其余的回调函数为可选加载。
检查点
ModelCheckpoint可以在模型学习的迭代过程中对模型进行备份,其对象的创建方式如下:
keras.callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=0,
save_best_only=False,
save_weights_only=False,
mode='auto', period=1)
动态调参和早停工具
Keras的内置回调函数包含了动态调整学习参数和进行学习终止判定的子类,包括LearningRateScheduler、ReduceLROnPlateau、TerminateOnNaN、EarlyStopping,其中前2个子类用于调节优化器的学习速率(参见“优化器”),后2个子类分别为异常值终止和早停法。上述对象的创建方式如下:
keras.callbacks.LearningRateScheduler(schedule, verbose=0)
keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=10,
verbose=0, mode='auto', min_delta=0.0001, cooldown=0, min_lr=0)
keras.callbacks.TerminateOnNaN()
keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=0,
verbose=0, mode='auto', baseline=None, restore_best_weights=False)
自定义回馈器
使用者可以通过在LambdaCallback中指定操作或对Callback进行子类继承创建自定义的回调函数。对第1种选择,LambdaCallback对象的创建方法为:
keras.callbacks.LambdaCallback(on_epoch_begin=None, on_epoch_end=None,
on_batch_begin=None, on_batch_end=None,
on_train_begin=None, on_train_end=None)
这里LambdaCallback的使用方法类似于Python中的
匿名函数,格式中的6个参数表示在学习的不同阶段可以进行的操作。
Keras作为一个高阶应用程序接口,其底层计算不是独立完成的,而是构架于支持张量计算的符号数学库之上,截至稳定版本2.2.4,Keras支持的底层构架包括Tensorflow、Microsoft-CNTK和Theano。Keras的后台API(keras.backend)包含一系列与后台交互的组件,这些组件中的部分函数对所有后台通用,但也包含一部分限制于特定后台的函数和类
Keras通用后台工具
Keras后台API的一些函数和类能够不依赖于特定的后台类型直接操作张量,这些函数在Keras文档中被称为“抽象后台(abstract Keras backend)函数”。后台API的抽象函数超过50个,按功能包括定义张量,例如keras.backend.placeholder、查看与检索张量,例如keras.backend.print_tensor、对张量进行计算,例如keras.backend.abs、内置函数/子类的计算,例如keras.backend.gradients、查看与修改后台设置,例如keras.backend.backend、keras.backend.set_epsilon以及通用的后台计算交互,例如keras.backend.ckear_session等
Keras后台指令交互
Keras后台API的一部分类是面向特定后台设计的,在导入keras后台,例如"import keras.backend as K"后,按后台选项,可通过K.tf和K.th调出Tensorflow和Theano的后台。在K.tf和K.th可以直接接收对应的后台指令,这里给出一个Tensorflow后台的例子
:
import keras.backend as K
# 使用K.tf对tf.ConfigProto进行操作
config = K.tf.ConfigProto()
config.gpu_options.allow_growth = True
# 使用K.tf对tf.Session进行操作
sess = K.tf.Session(config=config)
K.set_session(sess)
Keraskeras.json
Keras在导入后会生成一份json文件,通常位于用户主目录下的.keras/keras.json,该文件定义了Keras的全局选项,并显式指定了后台。这里给出一个后台文件的例子
"image_data_format": "channels_last",
"epsilon": 1e-07,
"floatx": "float32",
"backend": "tensorflow"
通过后台API可以查看keras.json的内容,例如对上述例子keras.backend.epsilon会返回1e-07。修改keras.json的“backend”可以切换Keras的后台
Keras提供了文本数据预处理的类和函数,这里简要列出其功能
:
Keras图像
Keras的图像数据预处理API是1个图像的生成器类:keras.preprocessing.image.ImageDataGenerator。在给定图像样本后,ImageDataGenerator可以进行数据强化(data augmentation)操作,包括旋转、反转、平移、白化等并输出图像
损失函数(keras.losses)
Keras以函数的形式定义了可用于神经网络学习和评价的损失函数,这里按表格的形式给出其内置损失函数的名称,代码和说明
:
名称 | 函数使用格式 | 用途说明 |
---|
| keras.losses.mean_squared_error(y_true, y) | |
均方对数误差 | keras.losses.mean_squared_logarithmic_error(y_true, y) | 取对数的均方误差。 |
| keras.losses.mean_absolute_error(y_true, y) | |
百分比平均绝对误差 | keras.losses.mean_absolute_percentage_error(y_true, y) | 按百分比计算的平均绝对误差。 |
铰链损失 | keras.losses.hinge(y_true, y) | |
平方铰链损失 | keras.losses.squared_hinge(y_true, y) | 铰链损失的平方。 |
类别铰链损失 | keras.losses.categorical_hinge(y_true, y) | 用于多元分类问题,具有稀疏性。 |
对数双曲余弦函数 | keras.losses.logcosh(y_true, y) | 用于回归问题,介于均方误差和平均绝对误差之间,具有一定的稀疏性。 |
| keras.losses.categorical_crossentropy(y_true, y) | 用于多元分类问题。 |
稀疏类型交叉熵 | keras.losses.sparse_categorical_crossentropy(y_true, y) | 用于分类问题,具有稀疏性。 |
二元分类交叉熵 | keras.losses.binary_crossentropy(y_true, y) | 用于二元分类问题。 |
| keras.losses.kullback_leibler_divergence(y_true, y) | 用于包含 概率分布的回归或分类问题,例如变分自编码器的学习。 |
| keras.losses.poisson(y_true, y) | |
余弦相似性损失 | keras.losses.cosine_proximity(y_true, y) | |
Keras的所有损失函数都接收2个输入,按顺序为代表真实值和代表预测值的张量,以Tensorflow为后台时,是tf.Tensor类,接收张量的大小必须匹配
。
表格中的损失函数可以按关键字调用,关键字与函数名相同,例如keras.losses.categorical_crossentropy的关键字为‘categorical_crossentropy’。一些损失函数的关键字有别名,例如keras.losses.mean_squared_error的关键字为可以为'mean_squared_error'或'mse'
。
激活函数(keras.activations)
Keras按两类方式提供神经网络模型的激活函数:一部分作为keras.engine.base_layer.Layer的子类被封装至层API中,另一部分则按函数的形式定义
。这里给出按函数形式定义的激活函数
:
名称 | 函数使用格式 | 说明 |
---|
| keras.activations.sigmoid(x) | 二元分类的输出层、 RNN门控 |
硬限幅Sigmoid函数 | keras.activations.hard_sigmoid(x) | 二元分类的输出层、 RNN门控 |
| keras.activations.softmax(x, axis=-1) | 多元分类的输出层 |
双曲正切函数 | keras.activations.tanh(x) | (浅层结构的)隐含层、RNN单元 |
Softsign函数 | keras.activations.softsign(x) | (浅层结构的)隐含层 |
指数函数 | keras.activations.exponential(x) | - |
线性函数 | keras.activations.linear(x) | - |
| keras.activations.relu(x, alpha=0.0, max_value=None, threshold=0.0) | (深度结构的)隐含层 |
指数线性函数 | keras.activations.elu(x, alpha=1.0) | (深度结构的)隐含层 |
尺度指数线性函数 | keras.activations.selu(x) | (深度结构的)隐含层 |
Softplus函数 | keras.activations.softplus(x) | (深度结构的)隐含层 |
激活函数接收一个张量并返回一个相同大小的张量,keras.activations.softmax的参数axis表示归一化的维度,默认为张量的最后1维,keras.activations.relu和keras.activations.elu的参数为其超参数
。
表格中激活函数可以按关键字调用,关键字与函数名相同。按关键字调用激活函数时,激活函数的超参数取默认值
。
评价函数(keras.metrics)
在应用方面,keras.losses中定义的所有函数均可作为评价函数使用,此外,keras.metrics额外定义了5个评价函数
:
keras.metrics.binary_accuracy可用于二元分类的评价。
keras.metrics.categorical_accuracy、sparse_categorical_accuracy可用于多元分类的评价。
keras.metrics.top_k_categorical_accuracy、sparse_top_k_categorical_accuracy可用于前k项分类的评价。
上述评价函数接收2个输入,按顺序为代表真实值和代表预测值的张量,张量大小必须匹配。评价函数可以按关键字调用,例如keras.metrics.binary_accuracy的关键字为'binary_accuracy'或'acc'
Keras提供了神经网络学习中可用的其它通用工具(keras.utils),这里将其列出
:
keras.utils.CustomObjectScope可以为用户自定义的对象设立关键字,并可以在keras代码中按关键字调用该对象。
keras.utils.HDF5Matrix是keras与HDF5文件交互的类,要求Python环境预装h5Py。
keras.utils.Sequence是序列生成器类,其主要作用是创建能够循环读取文件并生成数据的分批导入对象,该对象在神经网络模型的学习、评估和测试中可以使用
。
keras.utils.to_categorical是进行标记-类别转换的函数,将标记转换为类别,其中类别为0-1元素的Numpy矩阵,列数等于输入数据的不同标记数。
keras.utils.normalize是1个函数,功能是
数据标准化。
keras.utils.get_file是1个函数,功能是通过
url下载指定数据到本地路径。
keras.utils.plot_model是将编译的keras模型绘制为图像的函数,要求Python环境预装PyDot。
keras.utils.print_summary是将编译的keras模型总结为表格的函数,表格包括keras模型的结构和参数信息。
keras.utils.multi_gpu_model是仅在Tensorflow后台时使用的函数,可以将keras模型复制到多块GPU上进行并行计算。
KerasScikit-Learn封装器
完成编译(和学习)的keras模型可以通过Scikit-Learn封装器输出1个Scikit-Learn对象并加入到其环境下的机器学习和统计学习流程中
。具体地,keras分类器使用keras.wrappers.scikit_learn.KerasClassifier进行封装,keras回归器使用keras.wrappers.scikit_learn.KerasRegressor进行封装,封装时可以使用Scikit-Learn对象的共有属性和方法,包括fit、predict、predict_proba、score等
。该API要求Python环境预装Scikit-Learn
VGG16
Simonyan and Zisserman (2014)
ResNetXt50、101
Xie et al. (2017)
BSD协议(Facebook)
InceptionV3
Szegedy et al. (2016)
InceptionResNetV2
Szegedy et al. (2017)
阿帕奇授权协议(2.0版)
MobileNet
Howard et al. (2017)
阿帕奇授权协议(2.0版)
DenseNet121、169、201
Huang et al. (2017)
NASNet
Zoph et al. (2018)
阿帕奇授权协议(2.0版)
MobileNetV2
Sandler et al. (2018)
阿帕奇授权协议(2.0版)
根据其官方文档,Keras在开发时的关注点包括:用户友好、模块化、可扩展性和完全的Python支持。Keras同时也提供了由代码-产品间转化的途径,例如支持在iOS的Apple's CoreML
、Android的TensorFlow运行以及网页的JavaScript运行
。 -
Keras - Models - The Sequential model API
.Keras - Documentation.2019-07[引用日期2019-07-22]
-
Keras - Models - Model class API
.Keras - Documentation.2019-07[引用日期2019-07-22]
-
Keras - Layers - About Keras layers
.Keras Documentation.2019-07[引用日期2019-07-22]
-
Keras - Layers - Core Layers
.Keras Documentation.2019-07[引用日期2019-07-22]
-
Keras - Layers - Convolutional Layers
.Keras Documentation.2019-07[引用日期2019-07-22]
-
Keras - Layers - Recurrent Layers
.Keras Documentation.2019-07[引用日期2019-07-22]
-
Keras - Layers - Merge Layers
.Keras Documentation.2019-07[引用日期2019-07-30]
-
Writing your own Keras layers
.Keras Documentation.2019-07[引用日期2019-07-31]
-
Keras - Layers - Normalization Layers
.Keras Documentation.2019-07[引用日期2019-07-30]
-
Keras - Layers - Advanced Activation Layers
.Keras Documentation.2019-07[引用日期2019-07-30]
-
Keras - Layers - Layer Warppers
.Keras Documentation.2019-07[引用日期2019-07-30]
-
Keras - Layers - Noise Layers
.Keras Documentation.2019-07[引用日期2019-07-30]
-
Keras - Layers - Embedding Layers
.Keras Documentation.2019-07[引用日期2019-07-30]
-
Keras - Optimizers
.Keras - Documentation.2019-07[引用日期2019-07-22]
-
Keras - Initializers
.Keras - Documentation.2019-07[引用日期2019-07-22]
-
Keras - Usage of regularizers
.Keras Documentation.2019-07[引用日期2019-07-22]
-
Keras - Usage of constrains
.Keras Documentation.2019-07[引用日期2019-07-22]
-
Keras - Keras Backends
.Keras Documentation.2019-07[引用日期2019-07-30]
-
Keras - Sequence Preprocessing
.Keras Documentation.2019-07[引用日期2019-07-30]
-
Keras - Text Preprocessing
.Keras Documentation.2019-07[引用日期2019-07-30]
-
Keras - Image Preprocessing
.Keras Documentation.2019-07[引用日期2019-07-30]
-
Keras - Usage of loss functions
.Keras Documentation.2019-07[引用日期2019-07-22]
-
Keras - Usage of activations
.Keras Documentation.2019-07[引用日期2019-07-22]
-
Keras - Usage of metrics
.Keras Documentation.2019-07[引用日期2019-07-22]
-
Keras - utils
.Keras - Documentation.2019-07[引用日期2019-07-22]
-
Keras - Applications
.Keras documentation.2019-07[引用日期2019-07-30]
-
Chollet, F., 2017. Xception: Deep learning with depthwise separable convolutions. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 1251-1258).
Simonyan, K. and Zisserman, A., 2014. Very deep convolutional networks for large-scale image recognition. arXiv preprint arXiv:1409.1556.
He, K., Zhang, X., Ren, S. and Sun, J., 2016. Deep residual learning for image recognition. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 770-778).
He, K., Zhang, X., Ren, S. and Sun, J., 2016, October. Identity mappings in deep residual networks. In European conference on computer vision (pp. 630-645). Springer, Cham.
Xie, S., Girshick, R., Dollár, P., Tu, Z. and He, K., 2017. Aggregated residual transformations for deep neural networks. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 1492-1500).
Szegedy, C., Vanhoucke, V., Ioffe, S., Shlens, J. and Wojna, Z., 2016. Rethinking the inception architecture for computer vision. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 2818-2826).
Szegedy, C., Ioffe, S., Vanhoucke, V. and Alemi, A.A., 2017, February. Inception-v4, inception-resnet and the impact of residual connections on learning. In Thirty-First AAAI Conference on Artificial Intelligence.
Howard, A.G., Zhu, M., Chen, B., Kalenichenko, D., Wang, W., Weyand, T., Andreetto, M. and Adam, H., 2017. Mobilenets: Efficient convolutional neural networks for mobile vision applications. arXiv preprint arXiv:1704.04861.
Huang, G., Liu, Z., Van Der Maaten, L. and Weinberger, K.Q., 2017. Densely connected convolutional networks. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 4700-4708).
Zoph, B., Vasudevan, V., Shlens, J. and Le, Q.V., 2018. Learning transferable architectures for scalable image recognition. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 8697-8710).
Sandler, M., Howard, A., Zhu, M., Zhmoginov, A. and Chen, L.C., 2018. Mobilenetv2: Inverted residuals and linear bottlenecks. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (pp. 4510-4520).
Keras - Datasets
.Keras Documentation.2019-07[引用日期2019-07-30]
-
Keras - On Github Issues and Pull Requests
.GitHub, Inc..2019-08[引用日期2019-08-02]
-
Keras - Projects
.GitHub, Inc..2019-08[引用日期2019-08-02]
-
Keras - On Github Issues and Pull Requests
.Keras Documentation.2019-07[引用日期2019-07-31]
-
Keras - Auto Keras
.GitHub, Inc..2019-08[引用日期2019-08-02]
-
Keras - Tuner
.GitHub, Inc..2019-08[引用日期2019-08-02]
-
Running Keras models on iOS with CoreML
.PyImageSearch.2018-4-23[引用日期2019-07-31]
-
Keras - Why use Keras
.Keras Documentation.2019-08[引用日期2019-08-02]
-
Hale, J. Deep Learning Framework Power Scores 2018
.Towards Data Science.2018-09-19[引用日期2019-07-31]