实现自己的Keras层

一. 所有keras层的基类:Layer

keras的所有层的基类定义在keras/engine/topology.py文件中的Layer类中。

python语言基础

用到的装饰器:

  • @property 让类函数能像类变量一样操作
  • @interfaces.legacy_xxx_support 让函数支持keras 1.x的 API
  • @classmothod 类函数,属于整个类,类似于C++/JAVA中的静态函数。类方法有类变量cls传入,从而可以用cls做一些相关的处理。子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。既可以在类内部使用self访问,也可以通过实例、类名访问。
  • @staticmethod 将外部函数集成到类体中,既可以在类内部使用self访问,也可以通过实例、类名访问。基本上等同于一个全局函数

magic函数:

  • __call__ 让类的实例可以像函数一样调用,正是python的这种特性让我们可以像这样进行层之间的连接:
inputs = Input(shape=(784,))
# 前面的Dense(64, activation='relu')生成了类Dense的一个实例
# 后面的(input)将调用类Dense的__call__函数
x = Dense(64, activation='relu')(inputs) 

InputSpec: 确定层的ndim,dtype,shape,每一层都应有一个input_spec属性,保存InputSpec的实例的list(每一个输入tensor都对应一个)

重点关注以下函数

1. add_weight

每层的参数通过这个函数来设定。可以看到它最终调用的是 K.variable 来生成变量,打开 keras/backend/tensorflow_backend.py 可以看到它生成变量的方式:

v = tf.Variable(value, dtype=tf.as_dtype(dtype), name=name)

让人惊讶的是,keras从居然不是使用tf.get_variable的方式生成变量,可见keras在设计时就根本没有考虑到变量共享,从之前的经验来看,要用keras设计多GPU程序是非常棘手的。(要想让Keras支持多GPU并行,必须从这一步开始修改代码,而这里已经是keras非常底层的代码了。)

2. call / __call__

call是最重要的函数,它用于实现层的功能,子类必须实现

魔法函数 __call__ 会将收到的输入传递给 call 函数,然后调用 call 函数实现具体的功能

3. comput_output_shape

根据input_shape 计算输出的shape,子类必须实现用于自动推断下一层的输入尺寸

4. build

用来创建当前层的weights子类必须实现

5. get_config / from_config

get_config 返回一个字典,获取当前层的参数信息。

from_config 使用根据参数生成一个新的层。代码只有一行:

@classmethod
def from_config(cls, config):
    return cls
  • 11
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值