发布时间:2024-09-02 15:01
前言:Keras提供众多常见的已编写好的层对象,例如常见的卷积层、池化层等,我们可以直接通过以下代码调用。Keras中的层大致上分为两种类型:
第一种是带有训练参数的:比如Dense层、Conv2D层,等等,我们在训练的过程中需要训练层的权重和偏置项;
第二种是不带训练参数的:比如dropout层、flatten层、等等,我们不需要训练它的权重,只需要对输入进行加工处理再输出就行了。
我们在实际应用中,我们经常需要自己构建一些层对象,已满足某些自定义网络的特殊需求。,也无非就是上面两种,一种是带有参数的,一种是不带参数的,不管是哪一种,幸运的是,Keras对自定义层都提供了良好的支持。
一、Lambda层
二、自定义层
2.1 Dense层解析
2.2 三个核心方法的解析
(1)build方法
(2)call方法
(3)
compute_output_shape
方法2.3 基类Layer中的定义
对于简单、无状态的自定义操作,你也许可以通过 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 层的骨架(如果你用的是旧的版本,请更新到新版)。你只需要实现三个方法即可:
要定制自己的层,需要实现下面三个方法