Lv.的博客

Keras -Python编写的开源人工神经网络库

 

Keras是一个由Python编写的开源人工神经网络库,可以作为Tensorflow、Microsoft-CNTK和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化 [1]  。
Keras在代码结构上由面向对象方法编写,完全模块化并具有可扩展性,其运行机制和说明文档有将用户体验和使用难度纳入考虑,并试图简化复杂算法的实现难度 [1]  。Keras支持现代人工智能领域的主流算法,包括前馈结构和递归结构的神经网络,也可以通过封装参与构建统计学习模型 [2]  。在硬件和开发环境方面,Keras支持多操作系统下的多GPU并行计算,可以根据后台设置转化为Tensorflow、Microsoft-CNTK等系统下的组件 [3]  。
Keras的主要开发者是谷歌工程师François Chollet,此外其GitHub项目页面包含6名主要维护者和超过800名直接贡献者 [4] 。Keras在其正式版本公开后,除部分预编译模型外,按MIT许可证开放源代码 [1]  。
 
 
外文名
Keras
开发者
François Chollet 等 [4] 
初始版本
0.1.0/2015年6月13日 [5] 
稳定版本
2.3.0/2019年09月17日 [5] 
编程语言
Python
平    台
Linux,macOS,Windows
类    型
神经网络库,应用程序接口
许可协议
MIT License(不包含预编译模型)

历史与命名

编辑
Keras的前身是François Chollet为ONEIROS(Open-ended Neuro-Electronic Intelligent Robot Operating System)项目所的编写的代码,在2015年分离成为开源的人工神经网络工具。Keras的最初版本以Theano为后台,设计理念参考了Torch但完全由Python编写 [5]  。2015年11月的Keras测试版本0.3.0,Tensorflow被加入了后台选项。2016年4月,Keras在PIPy上发布了第一个稳定版本1.0.0 [5]  。2017年5月,Keras版本2.0.0发布 [5]  。同年6月,Keras版本2.0.5测试性地将Microsoft-CNTK加入后台选项 [5]  。
自2017年起,Keras得到了Tensorflow团队的支持,其大部分组件被整合至Tensorflow的Python API中。在2018年Tensorflow 2.0.0公开后,Keras被正式确立为Tensorflow高阶API,即tf.keras [6]  。此外自2017年7月开始,Keras也得到了CNTK 2.0的后台支持 [7]  。
在2019年9月17日Keras稳定版本2.3.0的更新文档中,Keras团队宣布了计划调整:在该版本之后,Keras将集中于Tensoflow后台的有关内容,多后台Keras的开发优先度被降低,且更新将仅包含补丁(bug fix),不会有新的功能性内容移植/加入 [5]  。
Keras的命名来自古希腊语“κέρας (牛角)”或 “κραίνω(实现)”,意为将梦境化为现实的“牛角之门” [1]  。由荷马史诗《奥德赛》第19卷佩涅罗佩与奥德修斯的对话,无法挽留的梦幻拥有两座门,一座门由牛角制成,一座门由象牙制成,象牙之门内光彩夺目,却仅是无法实现的梦境;唯有走进牛角之门,才能由梦境看见真实 [8]  。

安装

编辑
Keras支持Python 2.7-3.6版本,且安装前要求预装TensorFlow、Theano、Microsoft-CNTK中的至少一个 [1]  。其它可选的预装模块包括:h5py,用于将Keras模型的保存为HDF文件;cuDNN,用于GPU计算;PyDot,用于模型绘图 [1]  。Keras可以通过PIPy、Anaconda安装,也可从GitHub上下载源代码安装 [1]  :
1
2
pip install keras
conda install keras

神经网络API

编辑
Keras的神经网络API是在封装后与使用者直接进行交互的API组件,在使用时可以调用Keras的其它组件。除数据预处理外,使用者可以通过神经网络API实现机器学习任务中的常见操作,包括人工神经网络的构建、编译、学习、评估、测试等 [9] 。

属性与方法

Keras支持序列化模型和函数化模型,且二者具有一定数量的公有属性(attribute)和方法(method)。其中的公有属性包括layers、inputs、outputs,能够以Python列表的形式返回模型信息 [9]  :
  • 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”)堆叠得到的神经网络模型 [10]  。序列化模型有两种定义方式,一种是运行keras.models.Sequential时由列表指定所有的层对象,另一种是在运行时不指定层API,而是对Sequential类使用model.add添加层对象,这里给出使用的例子:
1
2
3
4
5
6
7
8
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 [10]  。
函数化模型(keras.models.Model)
Keras的函数化模型也被称为functional API,其功能是将一个张量指定为输入,另一个张量指定为输出,并将与输入、输出张量之间存在连接的节点(层对象)组合成神经网络模型 [11]  。这里提供一个函数化模型的使用例子。
1
2
3
4
5
6
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的函数化模型支持自定义的子类继承 [9]  ,但在定义子类时,模型的拓扑结构由Keras的Python代码而不是层对象的静态图指定,因此一部分基于模型静态图的方法在子类继承后无法使用 [9]  。

使用模型

编译(model.complie)
Keras模型的编译由model.compile实现,运行时可将Keras代码翻译为后台代码以执行学习、评估等后续操作。编译可以指定学习组件(参见“学习与优化API”),其使用格式如下 [11]  :
1
2
model.compile(optimizer, loss=None, metrics=None, loss_weights=None
            sample_weight_mode=None, weighted_metrics=None, target_tensors=None
格式中各参量的含义和调用方法如下 [11]  :
  • 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进行学习,其使用格式如下 [11]  :
1
2
3
4
5
6
7
8
9
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的使用格式包含一些共有的参量,其含义和调用方法如下 [11]  :
  • 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进行模型评估,二者的使用格式如下 [11]  :
1
2
3
4
5
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进行测试,其使用格式如下 [11]  :
1
2
3
4
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)

层API

编辑
这里对Keras的层API(keras.layers)进行介绍。在Keras的神经网络API中,层API创建的层对象被用于搭建模型 [12]  。

属性与方法

Keras的层API包含一些共有方法,这些方法与给定层对象的结构和权重更新有关 [12]  :
  • 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) 按节点索引返回层对象输出张量的大小
当一个层对象仅有一个节点,即没有层对象的合并时,上述方法按属性的形式使用 [12]  :
  • layer.input
  • layer.output
  • layer.input_shape
  • layer.output_shape
作为进一步说明,Keras中所有的层(子类),除输入层外都继承自keras.engine.base_layer.Layer类,在该类中,层的“节点”是输入和输出张量的连结。例如在顺序连结的Keras模型中,每个层对象都只有一个节点,但包含共享输入或输出的层对象,例如keras.layers.concatenate按张量映射的顺序,包含了多个节点 [12]  。

核心层

输入层(keras.layers.Input)
Keras的输入层继承自keras.engine.input_layer,是一个后台张量,例如tf.Tensor的实现。由Keras的输入层子类创建层对象的方式为 [13]  :
1
2
keras.layers.Input(shape=None, batch_shape=None
                   name=None, dtype=None, sparse=False, tensor=None)
格式中各参量的含义和调用方法如下 [13]  :
  • shape和batch_shape表示张量的大小,接收Python元组,其中shape不指定数据批次的长度。
  • name接收一个字符串,表示该输入层的名称
  • dtype按字符形式接收张量的数据类型,例如‘float32’、'int32'等
  • spare和tensor表示输入层返回张量的类型,前者表示是否返回稀疏张量,后者取默认值时创建一个张量占位符,接收了指定张量时返回数值到该指定张量。
全连接层(keras.layers.Dense)
Keras内部全连接层对象的创建方式为 [13]  :
1
2
3
4
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)
格式中各参量的含义和调用方法如下 [13]  :
  • 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支持创建独立的激活层对象,其创建方式为 [13]  :
1
keras.layers.Activation(activation)
格式中的activation表示一个Keras的激活函数对象、例如keras.activations.sigmoid。将激活层前置于全连接层时可以实现神经网络中的预激活(pre-activation)操作。激活层和全连接层中的activation参量不产生冲突,同时使用时会分别进行激活函数计算 [13]  。此外Keras也可以直接从层API创建激活层,参见“特殊激活层”。
随机失活层
参见:随机失活
Keras支持随机连接失活和随机空间失活,可用的子类包括Dropout、SpatialDropout1D、SpatialDropout2D和SpatialDropout3D,其创建方式为 [13]  :
1
2
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表示完全的随机连接失活 [13]  。
Keras中的随机空间失活,例如SpatialDropout2D会随机归零整个通道,例如对4维张量(t,x,y,c),2维的随机空间失活会随机选择某个c维和t维上所有的(x,y)元素归零 [13]  。
输出正则化层(keras.layers.ActivityRegularization)
Keras提供了独立的输出正则化层子类,并支持L1和L2正则化方法,其创建方式为 [13]  :
1
keras.layers.ActivityRegularization(l1=0.0, l2=0.0)
格式中的l1和l2接收对应的正则化系数。输出正则化层和全连接层中的activity_regularizer参量不产生冲突,使用时会分别执行正则化操作 [13]  。
张量操作层
Keras在层API中提供了支持特定张量操作的层类。由于张量操作层所进行的操作均可以类比NumPy数组中的对应操作,因此这里仅对张量操作层进行简单介绍 [13]  :
  • 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内置了一系列1维至3维的卷积层和池化层子类用于搭建卷积神经网络,且作为特色地,加入了深度可分卷积、转置卷积、扩张卷积等较为复杂的构筑。另注意到,Keras中卷积层和池化层的“维度”是特征图的维度,即一个keras的2维卷积层对象的输入和输出都是4维张量,通常为(样本/批次, 特征图第1维, 特征图第2维, 通道)。在指定data_format时也可以为(通道, 特征图第1维, 特征图第2维, 样本/批次) [14]  。
卷积层与深度可分卷积层
Keras包含1维至3维的卷积层,以及2维和3维的深度可分卷积层子类:Conv[1-3]D、SeparableConv[1,2]D。以2维情形为例,其对象的创建方式为 [14]  :
1
2
3
4
5
6
7
8
9
10
11
keras.layers.Conv2D(filters, kernel_size, strides=(11), padding='valid',  
             dilation_rate=(11), 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的共有参量
格式中共有参量的含义和调用方法如下 [14]  :
  • 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中参量的含义和调用方法如下 [14]  :
  • 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维极大池化和全局极大池化为例,池化层对象的创建方式为 [14]  :
1
2
3
keras.layers.MaxPooling2D(pool_size=(22), 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维情形为例,其创建方式为 [14]  :
1
2
3
4
5
6
7
keras.layers.Conv2DTranspose(filters, kernel_size, strides=(11), padding='valid'
             output_padding=None, dilation_rate=(11), 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=(22), data_format=None, interpolation='nearest')
Conv2DTranspose的参量的含义和调用方法如下 [14]  :
  • 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'表示双线性插值 [14]  。
裁剪和0值填充层
Keras支持创建2维和3维特征图的裁剪层对象:Cropping2D、Cropping3D;以及独立的1维至3维0值填充层对象:ZeroPadding1D、ZeroPadding2D、ZeroPadding3D,以2维情形为例,其创建方式分别为 [14]  :
1
2
keras.layers.Cropping2D(cropping=((00), (00)), data_format=None# 裁剪
keras.layers.ZeroPadding2D(padding=(11)) # 0值填充
参量cropping接收2维或3维元组,表示由特征图边缘向中心裁剪去除的像素个数,对多维元组,其顺序为((第1维左, 第1维右), (第2维左, 第2维右))以此类推。cropping也接收单个整数,表示对特征图的所有维度进行相同像素的裁剪 [14]  。参量中的padding表示特征图各维度上0值填充的层数。

循环层与循环单元

Keras提供循环层和循环单元用于构建循环神经网络,二者是keras.engine.base_layer.Layer类的子类,属于层API的一部分,其中循环层是在功能上与其它层对象相当的构筑,可以直接堆叠得到神经网络模型;循环单元是循环层内对序列数据的每个时间步进行(系统)状态和输出进行处理的模块,一个循环层可以包含一个或多个循环单元 [15]  。
循环单元子类
Keras的循环单元子类包括简单循环单元(SimpleRNNCell)、长短期记忆单元(LSTMCell)、门控循环单元(GRUCell),其对应的子类实现方式如下:
简单循环单元的创建方式为 [15]  :
1
2
3
4
5
6
7
8
9
10
11
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类循环单元共有的参量的含义和调用方法如下 [15]  :
  • 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共有的参量的含义和调用方法如下 [15]  :
  • 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表示在时序输入与权重矩阵相乘后使用复位门 [15]  。此外LSTM单元有对应的循环卷积单元子类 [15]  。
循环层子类
Keras的循环层子类包括一个可接收任意循环单元的子类:keras.layers.RNN,和预设了特定循环单元的子类:SimpleRNN、GRU、LSTM、LSTM2D [15]  。不是一般性这里只对通用的子类进行介绍:
1
2
keras.layers.RNN(cell, return_sequences=False, return_state=False
                 go_backwards=False, stateful=False, unroll=False)
格式中参量的含义和调用方法如下 [15]  :
  • 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提供了8个层子类用于隐含层的合并,按对应的张量操作方式包括:加Add、减Subtract、乘Multiply、取均值Average、取极大值/极小值Maximum/Minimum、拼接Concatenate、点乘Dot。当上述子类的名称为全小写时,即add、multiply等,表示该子类的函数化接口 [16]  。
层间合并子类的输入为一个列表,列表内按顺序包含需要合并的张量,这里对张量的拼接给出一个例子:
1
2
3
4
5
6
7
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)# 使用函数化接口
= keras.layers.concatenate([x1, x2])# 使用层间合并对象
= keras.layers.Concatenate()([x1, x2])
model = keras.models.Model(inputs=[IN1, IN2], outputs=M)

自定义层

Keras可以使用自定义的层对象搭建模型,具体地,一个自定义层子类必须包含3个特定方法,其含义介绍如下 [17]  :
  • build(self, input_shape)是与隐含层权重有关的方法,包括权重张量的大小、初始化等。该方法的结尾要求指定self.built = True,实现方法之一是super(keras.layers.Layer, self).build(input_shape)
  • call(input_tensor)是层内计算的方法,要求返回张量的计算结果
  • compute_output_shape(input_shape)是返回张量计算后大小的方法。

其它子类

除上述子类外,keras的层API还包含一些其它子类,这里将其列出并简要介绍:
  • keras.layers.BatchNormalization是对层对象的输出张量进行分批归一化的子类 [18]  。
  • keras.layers.LeakyReLU、PReLU、ELU、ThresholdedReLU、ReLU和Softmax是可以从层API直接创建的激活层子类[19]  。
  • keras.layers.Bidirectional和keras.layers.TimeDistributed是层的封装器子类,以层对象为输入并为其赋予特定功能。其中Bidirectional仅接收循环层对象并赋予其双向连接,TimeDistributed接收所有隐含层对象并将该层的操作在一个维度“复制”[20]  。
  • keras.GaussianNoise、GaussianDropout和AlphaDropout为层对象的输出张量混入噪声,其中GaussianNoise按加法混入噪声,GaussianDropout和AlphaDropout按乘法混入噪声 [21]  。
  • keras.layers.Embedding可以实现张量的嵌入操作 [22]  。

学习与优化API

编辑

优化器

Keras内置了7个可在反向传播算法框架内使用的优化器(keras.optimizers),这些优化器按keras.optimizers.Optimizer的子类进行封装,这里对优化器的名称和实现进行介绍 [23]  :
名称对象
均方差传播算法(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。其余参数为各优化器可选的超参数 [23]  。
表格中优化器可以按关键字调用,关键字为小写的子类名称,例如keras.optimizers.Adam的关键字为'adam'。按关键字调用优化器时,其超参数取默认值 [23]  。

初始化器

Keras的初始化器子类(keras.initializers)提供了在创建层对象(时需要指定的权重初始化方法 [24]  。所有的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.regularizers)类提供了神经网络学习的正则化操作,即在计算损失函数时考虑该层权重的范数。Keras的正则化器继承自keras.regularizers.Regularizer类,包括L1正则化、L2正则化和两者的线性叠加,共3个子类 [25]  :keras.regularizers.l1、l2、l1l2。注意到,正则化器中的正则化系数,是正则化项(而非经验风险项)相乘的系数。

参数限制器

Keras中参数限制器(keras.constraints)类的功能是将神经网络权重的取值限定在一个范围内,防止神经网络在学习过程中出现个别高权重节点控制整体输出的情形出现;在特定问题下可使神经网络仅包含非负权重 [26]  。keras.constraints包含4个预设子类:MaxNorm、NonNeg、UnitNorm、MinMaxNorm,功能分别为限制权重极大值、限制负权重、权重(范数)归一化、权重0-1标准化 [26]  。

回调函数

Keras的回调函数(keras.callbacks)是一个特殊的类,其功能是在模型的学习过程中按条件触发给定的操作。Keras的回调函数预置了12个子类,也支持用户自定义的子类继承。一般地,回调函数对象在按列表的形式组织后可以在Keras神经网络API中进行调用:
1
2
3
# 定义并编译你的模型
callback_list = [callback1, callback2, callback3] # 定义回馈器
records = model.fit(..., callbacks=callback_list, ...) # 在模型学习时调用
记录与监控工具
Keras的内置回调函数中包含了一系列可用于记录和监控模型行为的子类:BaseLogger、CSVLogger、ProgbarLogger、History、RemoteMonitor、TensorBoard。其中BaseLogger和History在模型学习时会默认加载,其余的回调函数为可选加载。
检查点
ModelCheckpoint可以在模型学习的迭代过程中对模型进行备份,其对象的创建方式如下:
1
2
3
4
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个子类分别为异常值终止和早停法。上述对象的创建方式如下:
1
2
3
4
5
6
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对象的创建方法为:
1
2
3
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个参数表示在学习的不同阶段可以进行的操作。

后台API

编辑
Keras作为一个高阶应用程序接口,其底层计算不是独立完成的,而是构架于支持张量计算的符号数学库之上,截至稳定版本2.2.4,Keras支持的底层构架包括Tensorflow、Microsoft-CNTK和Theano。Keras的后台API(keras.backend)包含一系列与后台交互的组件,这些组件中的部分函数对所有后台通用,但也包含一部分限制于特定后台的函数和类 [27]  。

通用后台工具

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等 [27]  。

后台指令交互

Keras后台API的一部分类是面向特定后台设计的,在导入keras后台,例如"import keras.backend as K"后,按后台选项,可通过K.tf和K.th调出Tensorflow和Theano的后台。在K.tf和K.th可以直接接收对应的后台指令,这里给出一个Tensorflow后台的例子 [27]  :
1
2
3
4
5
6
7
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)

keras.json

Keras在导入后会生成一份json文件,通常位于用户主目录下的.keras/keras.json,该文件定义了Keras的全局选项,并显式指定了后台。这里给出一个后台文件的例子 [27]  :
1
2
3
4
5
6
{
    "image_data_format""channels_last",
    "epsilon": 1e-07,    
    "floatx""float32",    
    "backend""tensorflow"
}
通过后台API可以查看keras.json的内容,例如对上述例子keras.backend.epsilon会返回1e-07。修改keras.json的“backend”可以切换Keras的后台 [27]  。

数据预处理API

编辑

序列

Keras的序列数据预处理API可用于对时间序列和字符嵌入后的文本序列进行预处理。这里简要列出其功能 [28]  :
  • keras.preprocessing.sequence.TimeseriesGenerator是时间序列的生成器类,可以将时间序列数据分割为多个批次。
  • keras.preprocessing.sequence.pad_sequences是1个函数,将不同长度的序列填充为相同长度。
  • keras.preprocessing.sequence.skipgrams是1个函数,可以由嵌入的字符序列或语句生成skipgram。
  • keras.preprocessing.sequence.make_sampling_table是1个函数,可以由文本序列的样本数和采样系数生成概率采样表。

文本

Keras提供了文本数据预处理的类和函数,这里简要列出其功能 [29]  :
  • keras.preprocessing.text.Tokenizer是1个用于文本分割的类,按特定规则,例如空格将句子分割为单词并返回Tokenizer对象,该对象可用于文本编码等其它预处理操作。
  • keras.preprocessing.text.text_to_word_sequence是1个函数,按特定规则将句子分割并按列表返回单词序列。
  • keras.preprocessing.text.hashing_trick是1个函数,在给定Python环境下的hash算法后可以将输入的文本转化为哈希值
  • keras.preprocessing.text.one_hot类似于hashing_trick,使用Python默认的hash算法进行文本的独热编码

图像

Keras的图像数据预处理API是1个图像的生成器类:keras.preprocessing.image.ImageDataGenerator。在给定图像样本后,ImageDataGenerator可以进行数据强化(data augmentation)操作,包括旋转、反转、平移、白化等并输出图像 [30]  。

其它组件

编辑

函数

损失函数(keras.losses)
Keras以函数的形式定义了可用于神经网络学习和评价的损失函数,这里按表格的形式给出其内置损失函数的名称,代码和说明 [31]  :
名称函数使用格式用途说明
均方误差 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类,接收张量的大小必须匹配 [31]  。
表格中的损失函数可以按关键字调用,关键字与函数名相同,例如keras.losses.categorical_crossentropy的关键字为‘categorical_crossentropy’。一些损失函数的关键字有别名,例如keras.losses.mean_squared_error的关键字为可以为'mean_squared_error'或'mse' [31]  。
激活函数(keras.activations)
Keras按两类方式提供神经网络模型的激活函数:一部分作为keras.engine.base_layer.Layer的子类被封装至层API中,另一部分则按函数的形式定义 [32]  。这里给出按函数形式定义的激活函数 [32]  :
名称函数使用格式说明
Sigmoid函数 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的参数为其超参数 [32]  。
表格中激活函数可以按关键字调用,关键字与函数名相同。按关键字调用激活函数时,激活函数的超参数取默认值 [32]  。
评价函数(keras.metrics)
在应用方面,keras.losses中定义的所有函数均可作为评价函数使用,此外,keras.metrics额外定义了5个评价函数 [33]  :
  • 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' [33]  。

通用工具

Keras提供了神经网络学习中可用的其它通用工具(keras.utils),这里将其列出 [34]  :
  • keras.utils.CustomObjectScope可以为用户自定义的对象设立关键字,并可以在keras代码中按关键字调用该对象。
  • keras.utils.HDF5Matrix是keras与HDF5文件交互的类,要求Python环境预装h5Py。
  • keras.utils.Sequence是序列生成器类,其主要作用是创建能够循环读取文件并生成数据的分批导入对象,该对象在神经网络模型的学习、评估和测试中可以使用 [34]  。
  • 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上进行并行计算。

Scikit-Learn封装器

完成编译(和学习)的keras模型可以通过Scikit-Learn封装器输出1个Scikit-Learn对象并加入到其环境下的机器学习和统计学习流程中 [2]  。具体地,keras分类器使用keras.wrappers.scikit_learn.KerasClassifier进行封装,keras回归器使用keras.wrappers.scikit_learn.KerasRegressor进行封装,封装时可以使用Scikit-Learn对象的共有属性和方法,包括fit、predict、predict_proba、score等 [2]  。该API要求Python环境预装Scikit-Learn [2]  。

预编译模型

这里按表格的形式给出keras包含的预编译模型 [35]  :
名称提出者(按引用)许可协议
Xception Chollet (2017) [36]  MIT许可证
VGG16 Simonyan and Zisserman (2014) [37]  Creative Commons Attribution License
VGG19 Simonyan and Zisserman (2014) [37]  Creative Commons Attribution License
ResNet50、101、152 He et al. (2015) [38]  MIT许可证
ResNet50V2、101V2、152V2 He et al. (2016) [39]  BSD协议(Facebook)
ResNetXt50、101 Xie et al. (2017) [40]  BSD协议(Facebook)
InceptionV3 Szegedy et al. (2016) [41]  阿帕奇授权协议(2.0版)
InceptionResNetV2 Szegedy et al. (2017) [42]  阿帕奇授权协议(2.0版)
MobileNet Howard et al. (2017) [43]  阿帕奇授权协议(2.0版)
DenseNet121、169、201 Huang et al. (2017) [44]  BSD协议(第三版)
NASNet Zoph et al. (2018) [45]  阿帕奇授权协议(2.0版)
MobileNetV2 Sandler et al. (2018) [46]  阿帕奇授权协议(2.0版)

自带数据

Keras包含6份自带数据集,这里按表格形式给出其元数据 [47]  :
名称样本数说明
CIFRA10图像数据 50000,单样本为32x32 RGB图像 包含10个类别,用于图像分类问题
IMDB电影评价数据 25000,单样本为矢量化字符编码 按评价的正/负分类,用于二元情感分析
路透社新闻数据 11228,单样本为矢量化字符编码 按新闻主题分为46类,用于主题模型
MINST手写数字图像数据 60000,单样本为28x28灰度图像 包含10个类别,用于图像分类问题
MINST时尚物件图像数据 60000,单样本为28x28灰度图像 包含10个类别,用于图像分类问题
波士顿房价数据 约400个样本,单样本包含13个特征 用于回归问题

生态系统

编辑
Keras在Google Group和Slack上有用户交流区,细节有在其官方文档的主页列出 [1]  。错误报告和新功能请求可以通过Keras在Github的开发者页面进行反馈 [48]  。在Keras的Github项目页面上,有列出开发计划,用户可以申请加入并贡献内容[49]  。此外,Keras官方文档有介绍反馈错误和参与开发的准则 [50]  。
Keras包含一些与神经网络的微调和结构优化有关的子项目,包括AutoKeras [51]  和Keras-Tuner [52]  ,截至Keras主分支版本2.2.4,二者均处于开发阶段,未提供稳定版本。

比较与评价

编辑
根据其官方文档,Keras在开发时的关注点包括:用户友好、模块化、可扩展性和完全的Python支持。Keras同时也提供了由代码-产品间转化的途径,例如支持在iOS的Apple's CoreML [53]  、Android的TensorFlow运行以及网页的JavaScript运行 [54]  。
Keras被认为是深度学习开发端受到关注的工具之一,例如在2018年的一份测评中,Keras的普及率仅次于TensorFlow,超过了PyTorch、Microsoft-CNTK和Theano [55]  。
posted @ 2020-12-24 19:43  Avatarx  阅读(680)  评论(0编辑  收藏  举报