keras允许自定义Layer层, 大大方便了一些复杂操作的实现. 也方便了一些novel结构的复用, 提高搭建模型的效率.

实现方法

通过继承keras.engine.Layer类, 重写其中的部分方法, 实现层的自定义. 主要需要实现的方法及其意义有:

  • _ init _(self, **kwargs)

    作为类的初始化方法, 一般将需要传入的自定义参数存为对象的属性. 需要注意的有以下几点:

    • 由于继承Layer类, 所以在处理完自定义的参数之后, 仍可能还有参数需要父类处理, 所以需要调用父类的初始化方法, 将kwargs参数传入:

      class DecayingDropout(Layer):
      def __init__(self, initial_keep_rate=1., decay_interval=10000, decay_rate=0.977,
      noise_shape=None, seed=None, **kwargs):
      super(DecayingDropout, self).__init__(**kwargs)
    • 对象的self.supports_masking方法的作用是本层中是否涉及到使用mask或对mask矩阵进行计算. mask的作用是屏蔽传入Tensor的部分值, 常常在NLP问题中, 对句子padding之后, 不想让填补的0值对应的位置参与运算而使用. 这个参数默认为False, 如果有使用到, 需要将其值为True:

      self.supports_masking = True
  • build(self, input_shape, **kwargs)

    这里是定义权重的地方, 需要注意的有以下几点:

    • 通过self.add_weight方法定义权重, 且需要将权重存为类的属性, 例如:

      self.iterations = self.add_weight(name='iterations', shape=(1,), dtype=K.floatx(),
      initializer='zeros', trainable=False)

      其中self.iterations需要在初始化时设置为None, 符合类编程的习惯. self.add_weight方法有若干参数, 常用的即为上面几个.

    • 由于要求build方法必须设置self.built = True , 而这个方法在父类中实现, 因此, 在方法的最后需要调用:

      super(DecayingDropout, self).build(input_shape)
  • call(self, inputs, **kwargs)

    这里是编写层的功能逻辑的地方, 传入的第一个参数即输入张量, 即调用_ call _方法传入的张量. 除此之外, 需要注意的点有:

    • 如果需要在计算的过程中使用mask, 则需要传入mask参数:

      def call(self, x, mask=None):
      if mask is not None:
      mask = K.repeat(mask, x.shape[-1])
      mask = tf.transpose(mask, [0,2,1])
      mask = K.cast(mask, K.floatx())
      x = x * mask
      return K.sum(x, axis=self.axis) / K.sum(mask, axis=self.axis)
      else:
      return K.mean(x, axis=self.axis)
    • 如果该层在训练和预测时的行为不一样(如Dropout)函数, 需要传入指定参数training, 即使用布尔值指定调用的环境. 例如在Dropout层的源码中, call方法是这样实现的:

      def call(self, inputs, training=None):
      if 0. < self.rate < 1.:
      noise_shape = self._get_noise_shape(inputs) def dropped_inputs():
      return K.dropout(inputs, self.rate, noise_shape,
      seed=self.seed)
      return K.in_train_phase(dropped_inputs, inputs,
      training=training)

      K.in_train_phase() 方法就是用来区别在不同环境调用时, 返回的不同值的. 这个函数通过training参数区别调用环境, 如果是训练环境, 则返回第一个参数对应的结果, 预测环境则返回第二个参数对应的结果. 可以传入函数, 返回这个函数对应的返回结果.

    • 除了计算之外, 这个函数也是更新层内参数的地方, 即build方法中增加的参数. 通过self.add_update方法进行更新, 例如:

      def call(sekf, x):
      self.add_update([K.moving_average_update(self.moving_mean, mean,self.momentum),
      K.moving_average_update(self.moving_variance,variance,self.momentum)],
      inputs)

      或者:

      def call(self, inputs, training=None):
      self.add_update([K.update_add(self.iterations, [1])], inputs)

      可以看到, self.add_update方法传入一个列表, 包含一些列更新的动作. 这些更新的动作需要借助K的一些函数实现, 如K.moving_average_update, K.update_add等等.

      另外还可以传入inputs函数, 作为更新的前提条件.


除此之外, 还有一些常常需要重新定义的方法:

  • get_config(self):

    返回层的一些参数. 对于自定义的参数, 需要在此指定返回:

    def get_config(self):
    config = {'initial_keep_rate': self.initial_keep_rate,
    'decay_interval': self.decay_interval,
    'decay_rate': self.decay_rate,
    'noise_shape': self.noise_shape,
    'seed': self.seed}
    base_config = super(DecayingDropout, self).get_config()
    return dict(list(base_config.items()) + list(config.items()))
  • compute_output_shape(input_shape) :

    计算输出shape. input_shape是输入数据的shape.

  • compute_mask(self, input, input_mask=None):

    计算输出的mask, 其中input_mask为输入的mask. 需要注意的有:

    • 如果input_mask为None, 说明上一层没有mask. 可以在本层创建一个新的mask矩阵.

    • 如果以后的层不需要使用mask, 返回None即可, 之后就不存在mask矩阵了

      def compute_mask(self, input, input_mask=None):
      # need not to pass the mask to next layers
      return None
    • 如果经过本层, mask矩阵没有变化, 不用实现该函数, 只需要在初始化时, 指定self.supports_masking = True即可.

参考资料

编写你自己的Keras层

Keras编写自定义层--以GroupNormalization为例

Keras自定义实现带masking的meanpooling层

Keras实现支持masking的Flatten层

Layer层自定义的更多相关文章

  1. 如果layer层在iframe下不居中滚动

    需要在layer前面加上parent.layer. 2.运用layer层的步骤: 1.引入1.8版本以上的jquery文件 <script type="text/javascript& ...

  2. 当music-list向上滑动的时候,设置layer层,随其滚动,覆盖图片,往下滚动时候,图片随着展现出来

    1.layer层代码: <div class="bg-layer" ref="layer"></div> 2.在mounted()的时候 ...

  3. 3.4 常用的两种 layer 层 3.7 字体与文本

    3.4 常用的两种 layer 层  //在cocos2d-x中,经常使用到的两种 layer 层 : CCLayer 和 CCLayerColor //CCLayer 的创建 CCLayer* la ...

  4. caffe layer层cpp、cu调试经验和相互关系

    对于layer层的cpp文件,你可以用LOG和printf.cout进行调试,cu文件不能使用LOG,可以使用cout,printf. 对于softmaxloss的layer层,既有cpp文件又有cu ...

  5. ZBrush中Layer层笔刷介绍

    本文我们来介绍ZBrush®中的Layer层笔刷,该笔刷是一种类似梯田效果的笔刷,常用来制作鳞甲和花纹图腾.他还可以用一个固定的数值抬高或降低模型的表面,当笔刷在重合时,笔画重叠部分不会再次位移,这使 ...

  6. layer层、modal模拟窗 单独测试页面

    layer_test.jsp <%@ page language="java" import="java.util.*" pageEncoding=&qu ...

  7. layer.alert自定义关闭回调事件

    在项目应用中,遇到自定义关闭layer.alert弹出层,即在关闭layer.alert时,可以自动触发关闭时的事件, 具体方法为: layer.alert('爱心提示!', function(){ ...

  8. [Cocos2d-x For WP8]Layer 层

        层(CCLayer) 从概念上说,层就是场景里的背景. CCLayer同样是CCNode的子类,通常用addChild方法添加子节点.CCLayer对象定义了可描绘的区域,定义了描绘的规则.C ...

  9. 非常好的分页组建layPage和 layer层特效

    http://layer.layui.com/ http://sentsin.com/layui/laypage/

随机推荐

  1. Spring编程式注解使用不当导致其他事务无法正常提交

    1.事故背景 原本在使用的是注解式事务,后面因为需要在事务中增加异步推送机制,所以需要将推送机制放到事务之外,修改后发现系统经常出现事务长时间无法提交导致回滚. 2.排查流程 (1)一开始重启应用是能 ...

  2. Python 30道高频面试题及详细解答

    开学啦,开学啦!周末坐地铁的时候看到很多同学推着行李箱,拎着大包小包的穿梭在人群中,哎新的一学期又开始啦,同时也意味着很多同学要准备毕业啦,尤其是准大四,准研三的同学. 今年的招聘行情并不乐观,小公司 ...

  3. 我对Flutter的第一次失望

    老孟导读:此文翻译自:https://medium.com/@suragch/my-first-disappointment-with-flutter-5f6967ba78bf 我喜欢Flutter. ...

  4. lidar激光雷达领域的分类

    lidar领域可以按分为以下五方面: 激光雷达系统与装备 激光雷达系统与开发 激光雷达光源 激光雷达探测 多光谱激光雷达系统 单光子激光雷达系统 低成本RGB-D距离传感器 激光雷达元器件及装备等 激 ...

  5. HTTPS建立过程

    由于HTTPS建立过程经常忘记,固记录 HTTPS建立流程 客户端发起SSL连接 服务端发送证书(证书中包含了服务端公钥) 客户端根据已有证书判断是否是可信任的(客户端决定是否继续) 服务端要求客户端 ...

  6. 12_Python语法示例(函数)

    1.写一个函数mysum,此函数带有两个参数x,y打印出两个参数x,y的和 def mysum(x, y): print(x + y) mysum(3, 2) 2.写一个函数print_even,传入 ...

  7. 部署一套完整的Kubernetes高可用集群(二进制,最新版v1.18)下

    七.高可用架构(扩容多Master架构) Kubernetes作为容器集群系统,通过健康检查+重启策略实现了Pod故障自我修复能力,通过调度算法实现将Pod分布式部署,并保持预期副本数,根据Node失 ...

  8. Oracle WITH 语句 语法

    With语句可以在查询中做成一个临时表/View,用意是在接下来的SQL中重用,而不需再写一遍. With Clause方法的优点: 增加了SQL的易读性,如果构造了多个子查询,结构会更清晰. 示例: ...

  9. Fabric1.4 kafka共识的多orderer集群

    https://www.cnblogs.com/zhangmingcheng/p/10556469.html#FeedBack https://yq.aliyun.com/articles/63746 ...

  10. AP、AC、无线路由器

    起因 AP.AC.无线路由器 一直都傻傻的分不清,今天就好好的研究一下他们之间到底有什么联系和区别~ AP 什么是AP? 无线AP(Access Point):即无线接入点,它用于无线网络的无线交换机 ...