keras实现自定义层的关键步骤解析

发布时间:2024-09-02 15:01

keras实现自定义层的关键步骤解析_第1张图片

keras实现自定义层的关键步骤解析_第2张图片 

前言:Keras提供众多常见的已编写好的层对象,例如常见的卷积层、池化层等,我们可以直接通过以下代码调用。Keras中的层大致上分为两种类型:

第一种是带有训练参数的:比如Dense层、Conv2D层,等等,我们在训练的过程中需要训练层的权重和偏置项;

第二种是不带训练参数的:比如dropout层、flatten层、等等,我们不需要训练它的权重,只需要对输入进行加工处理再输出就行了。

我们在实际应用中,我们经常需要自己构建一些层对象,已满足某些自定义网络的特殊需求。,也无非就是上面两种,一种是带有参数的,一种是不带参数的,不管是哪一种,幸运的是,Keras对自定义层都提供了良好的支持。

一、Lambda层

二、自定义层

    2.1 Dense层解析

    2.2 三个核心方法的解析

        (1)build方法

        (2)call方法

        (3)compute_output_shape方法

    2.3 基类Layer中的定义

一、Lambda层

对于简单、无状态的自定义操作,你也许可以通过 layers.core.Lambda 层来实现。即使用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:可选,字典,用来记录向函数中传递的其他关键字参数

注意:也不是说对于没有训练参数的层就一定要用Lambda层,我也可以使用自定义的层,只不过是没必要那么复杂而已。

二、自定义层

但是对于那些包含了可训练权重的自定义层,你应该自己实现这种层。在这种情况下,我们需要定义的是一个全新的、拥有可训练权重的层,这个时候我们就需要使用下面的方法。即通过编写自定义层,从Layer中继承。

下面的内容来自官方文档,有部分是自己的注解,后面着重总结的

这是一个 Keras2.0 中,Keras 层的骨架(如果你用的是旧的版本,请更新到新版)。你只需要实现三个方法即可:

要定制自己的层,需要实现下面三个方法

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

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号