自定义层

# 自定义层

定义

 M.dl_layer_userlayer.v1(layer_class,name)

对于简单的定制操作,我们或许可以通过使用layers.core.Lambda层来完成。但对于任何具有可训练权重的定制层,你应该自己来实现。 这里是一个层应该具有的框架结构,要定制自己的层,你需要实现下面三个方法:

  • build(input_shape):这是定义权重的方法,可训练的权应该在这里被加入列表`self.trainable_weights中。其他的属性还包括self.non_trainabe_weights(列表)和self.updates(需要更新的形如(tensor, new_tensor)的tuple的列表)。你可以参考BatchNormalization层的实现来学习如何使用上面两个属性。这个方法必须设置self.built = True,可通过调用super([layer],self).build()实现
  • call(x):这是定义层功能的方法,除非你希望你写的层支持masking,否则你只需要关心call的第一个参数:输入张量
  • compute_output_shape(input_shape):如果你的层修改了输入数据的shape,你应该在这里指定shape变化的方法,这个函数使得Keras可以做自动shape推断

参数:

  • layer_class:可选,代码,默认值from keras.engine.topology import Layer class UserLayer(Layer): def init(self): self.output_dim = 123 super(UserLayer, self).init() def build(self, input_shape): # Create a trainable weight variable for this layer. self.kernel = self.add_weight(name='kernel', shape=(input_shape[1], self.output_dim), initializer='uniform', trainable=True) super(UserLayer, self).build(input_shape) # Be sure to call this somewhere! def call(self, x): from keras import backend as K return K.dot(x, self.kernel) def compute_output_shape(self, input_shape): return (input_shape[0], self.output_dim) # 必须也将 UserLayer 赋值给 bigquant_run bigquant_run = UserLayer ,用户层定义
  • name:可选,字符,默认值null,名字, name, 可选,层的名字,在模型里不能有两个层同名。如果不指定,将自动分配名字

返回:

示例代码

# 本代码由可视化策略环境自动生成 2019年7月4日 13:52

# 本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。

from keras.engine.topology import Layer

class UserLayer(Layer):

def __init__(self):
    self.output_dim = 123
    super(UserLayer, self).__init__()

def build(self, input_shape):
    # Create a trainable weight variable for this layer.
    self.kernel = self.add_weight(name='kernel',
                                  shape=(input_shape[1], self.output_dim),
                                  initializer='uniform',
                                  trainable=True)
    super(UserLayer, self).build(input_shape)  # Be sure to call this somewhere!

def call(self, x):
    from keras import backend as K
    return K.dot(x, self.kernel)

def compute_output_shape(self, input_shape):
    return (input_shape[0], self.output_dim)

# 必须也将 UserLayer 赋值给 m1_layer_class_bigquant_run

m1_layer_class_bigquant_run = UserLayer

m1 = M.dl_layer_userlayer.v1(
layer_class=m1_layer_class_bigquant_run,
name=''
)