Keras提供众多常见的已编写好的层对象,例如常见的卷积层、池化层等,我们可以直接通过以下代码调用:
# 调用一个Conv2D层
from keras import layers
conv2D = keras.layers.convolutional.Conv2D(filters,\
kernel_size, \
strides=(1, 1), \
padding='valid', \
...)
但是在实际应用中,我们经常需要自己构建一些层对象,已满足某些自定义网络的特殊需求。
幸运的是,Keras对自定义层提供了良好的支持。
下面对常用方法进行总结。
方法1:keras.core.lambda()
如果我们的自定义层中不包含可训练的权重,而只是对上一层输出做一些函数变换,那么我们可以直接使用keras.core
模块(该模块包含常见的基础层,如Dense、Activation等)下的lambda函数:
keras.layers.core.Lambda(function, output_shape=None, mask=None, arguments=None)
参数说明:
function:要实现的函数,该函数仅接受一个变量,即上一层的输出
output_shape:函数应该返回的值的shape,可以是一个tuple,也可以是一个根据输入shape计算输出shape的函数
mask: 掩膜
arguments:可选,字典,用来记录向函数中传递的其他关键字参数
但是多数情况下,我们需要定义的是一个全新的、拥有可训练权重的层,这个时候我们就需要使用下面的方法。
方法2: 编写Layer继承类
keras.engine.topology
中包含了Layer的父类,我们可以通过继承来实现自己的层。
要定制自己的层,需要实现下面三个方法
build(input_shape):这是定义权重的方法,可训练的权应该在这里被加入列表self.trainable_weights
中。其他的属性还包括self.non_trainabe_weights
(列表)和self.updates
(需要更新的形如(tensor,new_tensor)的tuple的列表)。这个方法必须设置self.built = True
,可通过调用