[Keras] 使用Keras编写自定义网络层(layer)

Keras提供众多常见的已编写好的层对象,例如常见的卷积层、池化层等,我们可以直接通过以下代码调用:

# 调用一个Conv2D层
from keras import layers
conv2D = keras.layers.convolutional.Conv2D(filters,\
kernel_size, \
strides=(1, 1), \
padding='valid', \
...)

但是在实际应用中,我们经常需要自己构建一些层对象,已满足某些自定义网络的特殊需求。
幸运的是,Keras对自定义层提供了良好的支持。

下面对常用方法进行总结。

方法1: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:可选,字典,用来记录向函数中传递的其他关键字参数

但是多数情况下,我们需要定义的是一个全新的、拥有可训练权重的层,这个时候我们就需要使用下面的方法。

方法2: 编写Layer继承类

keras.engine.topology中包含了Layer的父类,我们可以通过继承来实现自己的层。
要定制自己的层,需要实现下面三个方法

build(input_shape):这是定义权重的方法,可训练的权应该在这里被加入列表self.trainable_weights中。其他的属性还包括self.non_trainabe_weights(列表)和self.updates(需要更新的形如(tensor,new_tensor)的tuple的列表)。这个方法必须设置self.built = True,可通过调用

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值