相关文章推荐
逆袭的灭火器  ·  Deep learning with ...·  4 天前    · 
爱逃课的啤酒  ·  json - when does php ...·  11 月前    · 
有胆有识的帽子  ·  Windows-cmd ...·  1 年前    · 
Keras是一个由 Python 编写的开源 人工神经网络 库,可以作为 Tensorflow 、Microsoft-CNTK和Theano的高阶 应用程序接口 ,进行 深度学习 模型的设计、调试、评估、应用和可视化
Keras在代码结构上由 面向对象 方法编写,完全 模块化 并具有 可扩展性 ,其运行机制和说明文档有将 用户体验 和使用难度纳入考虑,并试图简化复杂算法的实现难度 。Keras支持现代 人工智能 领域的主流算法,包括前馈结构和递归结构的神经网络,也可以通过封装参与构建统计学习模型 。在硬件和开发环境方面,Keras支持多 操作系统 下的多GPU 并行计算 ,可以根据后台设置转化为Tensorflow、Microsoft-CNTK等系统下的组件
Keras的主要开发者是谷歌工程师François Chollet,此外其 GitHub 项目页面包含6名主要维护者和超过800名直接贡献者 。Keras在其正式版本公开后,除部分预编译模型外,按 MIT许可证 开放源代码
Keras的前身是François Chollet为ONEIROS(Open-ended Neuro-Electronic Intelligent Robot Operating System)项目所的编写的代码,在2015年分离成为开源的人工神经网络工具。Keras的最初版本以Theano为后台,设计理念参考了Torch但完全由Python编写 。2015年11月的Keras测试版本0.3.0, Tensorflow 被加入了后台选项。2016年4月,Keras在PIPy上发布了第一个稳定版本1.0.0 。2017年5月,Keras版本2.0.0发布 。同年6月,Keras版本2.0.5测试性地将Microsoft-CNTK加入后台选项
自2017年起,Keras得到了Tensorflow团队的支持,其大部分组件被整合至Tensorflow的Python API中。在2018年Tensorflow 2.0.0公开后,Keras被正式确立为Tensorflow高阶API,即tf.keras 。此外自2017年7月开始,Keras也得到了CNTK 2.0的后台支持
在2019年9月17日Keras稳定版本2.3.0的更新文档中,Keras团队宣布了计划调整:在该版本之后,Keras将集中于Tensoflow后台的有关内容,多后台Keras的开发优先度被降低,且更新将仅包含补丁(bug fix),不会有新的功能性内容移植/加入
Keras的命名来自古希腊语“κέρας (牛角)”或 “κραίνω(实现)”,意为将梦境化为现实的“牛角之门” 。由荷马史诗《 奥德赛 》第19卷佩涅罗佩与 奥德修斯 的对话,无法挽留的梦幻拥有两座门,一座门由牛角制成,一座门由象牙制成,象牙之门内光彩夺目,却仅是无法实现的梦境;唯有走进牛角之门,才能由梦境看见真实
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还包含一些其它子类,这里将其列出并简要介绍: