Keras自定义layer

方法一:编写Layer继承类
keras.engine中包含了Layer的父类,我们可以通过继承来实现自己的层。
要定制自己的层,需要实现下面三个方法

  1. build(input_shape):这是定义权重的方法,可训练的权应该在这里被加入列表self.trainable_weights中。其他的属性还包括self.non_trainabe_weights(列表)和self.updates(需要更新的形如(tensor,new_tensor)的tuple的列表)。
  2. call(x):这是定义层功能的方法,除非你希望你写的层支持masking,否则你只需要关心call的第一个参数:输入张量。
  3. compute_output_shape(input_shape):如果你的层修改了输入数据的shape,你应该在这里指定shape变化的方法,这个函数使得Keras可以做自动shape推断。(非必要的)
  4. get_config():获取层的参数信息,非必要。
from keras.layers.core import Layer
from keras.engine import InputSpec
from keras import backend as K
from keras import initializers
class Scale(Layer):
    '''
    Code borrows from https://github.com/flyyufelix/cnn_finetune
    '''
    def __init__(self, weights=None, axis=-1, gamma_init='zero', **kwargs):
        self.axis = axis
        self.gamma_init = initializers.get(gamma_init)
        self.initial_weights = weights
        super(Scale, self).__init__(**kwargs)
    def build(self, input_shape):
        self.input_spec = [InputSpec(shape=input_shape)]
        # Compatibility with TensorFlow >= 1.0.0
        self.gamma = K.variable(self.gamma_init((1,)), name='{}_gamma'.format(self.name))
        self.trainable_weights = [self.gamma]
        if self.initial_weights is not None:
            self.set_weights(self.initial_weights)
            del self.initial_weights
    
    def call(self, x, mask=None):
        return self.gamma * x
    def get_config(self):
        config = {"axis": self.axis}
        base_config = super(Scale, self).get_config()
        return dict(list(base_config.items()) + list(config.items()))

方法二:如果我们的自定义层中不包含可训练的权重,而只是对上一层输出做一些函数变换,那么我们可以直接使用keras.layers模块下的lambda函数:

keras.layers.Lambda(function, output_shape=None, mask=None, arguments=None)

参数说明:
function:要实现的函数,该函数仅接受一个变量,即上一层的输出
output_shape:函数应该返回的值的shape,可以是一个tuple,也可以是一个根据输入shape计算输出shape的函数
mask: 掩膜
arguments:可选,字典,用来记录向函数中传递的其他关键字参数

o_pam = Lambda(lambda x: K.batch_dot(x[0], x[1]))([beta_pam, flat_h_pam])

你可能感兴趣的:(AI,keras,tensorflow)