Keras自定义Layer使用说明

本文详细介绍了如何在tf.keras中自定义神经网络层,包括使用Lambda函数创建自定义激活函数,以及通过叠加多个Dense层构建自定义MLPBlock层。文章还对比了tf.keras与Keras在自定义层方面的API差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义 Layer

自定义激活函数

函数形式比较简单的时候可以用lambda函数:

clipped_relu = lambda x: K.activations.relu(x, max_value=4000)
Layer类
class MLPBlock(Layer):

	def __init__(self):
		super(MLPBlock, self).__init__()
		self.dense_1 = K.layers.Dense(500, kernel_regularizer=regularizers.l2(0.0))
		self.dense_2 = K.layers.Dense(500, kernel_regularizer=regularizers.l2(0.0))
		self.dense_3 = K.layers.Dense(500, kernel_regularizer=regularizers.l2(0.0))
		self.dense_4 = K.layers.Dense(500, kernel_regularizer=regularizers.l2(0.0))
		self.dense_5 = K.layers.Dense(60)

	def call(self, inputs):
		x = self.dense_1(inputs)
		x = tf.nn.relu(x)

		x = self.dense_2(x)
		x = tf.nn.relu(x)

		x = self.dense_3(x)
		x = tf.nn.relu(x)

		x = self.dense_4(x)
		x = tf.nn.relu(x)

		x = self.dense_5(x)
		return clipped_relu(x)

建立模型

这一步比较关键, 之前不成功主要是因为没有理解def call(self, inputs)这个类方法. 以下代码会报错:

input_layer = K.Input(shape=(8,))
output_layer = MLPBlock()
mdl = K.Model(input_layer, output_layer)
mdl.summary()

这是因为output_layer未被初始化, 不含input_shape这个重要信息, 只有当我们把input_layer作为参数传入自定义的output_layer时, output_layer才会被实际地初始化. 因此

input_layer = K.Input(shape=(8,))
output_layer = MLPBlock()(input_layer)
mdl = K.Model(input_layer, output_layer)
mdl.summary()

可以看到, 我们自定义的由多层Dense Layer叠加(stack)起来的新的Layer, 在形式上被作为一个新的Layer.

Model: "model_5"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_8 (InputLayer)         [(None, 8)]               0         
_________________________________________________________________
mlp_block_17 (MLPBlock)      (None, 60)                786060    
=================================================================
Total params: 786,060
Trainable params: 786,060
Non-trainable params: 0
_________________________________________________________________

以上自定义Layer的方法适用于tf.keras, 但不适用于Keras, 两者的API在自定义Layer方面有所不同. 根据我对官方说明的理解, tf.keras可以像前面的代码那样, 把许多现有的Layer叠加在一起, 形成一个新的自定义Layer, 而Keras中自定义Layer的时候似乎不能用这种方式来自定义Layer, 但可以用自定义Model的形式来实现, 如下面这段官方教程的代码

import keras

class SimpleMLP(keras.Model):

    def __init__(self, use_bn=False, use_dp=False, num_classes=10):
        super(SimpleMLP, self).__init__(name='mlp')
        self.use_bn = use_bn
        self.use_dp = use_dp
        self.num_classes = num_classes

        self.dense1 = keras.layers.Dense(32, activation='relu')
        self.dense2 = keras.layers.Dense(num_classes, activation='softmax')
        if self.use_dp:
            self.dp = keras.layers.Dropout(0.5)
        if self.use_bn:
            self.bn = keras.layers.BatchNormalization(axis=-1)

    def call(self, inputs):
        x = self.dense1(inputs)
        if self.use_dp:
            x = self.dp(x)
        if self.use_bn:
            x = self.bn(x)
        return self.dense2(x)

model = SimpleMLP()
model.compile(...)
model.fit(...)
Keras 是一个高度模块化的深度学习框架,提供了各种预定义的层类型,如全连接层、卷积层、池化层等等。然而,在某些情况下,您可能需要自定义一些层来实现您所需的特定功能。在 Keras 中,您可以通过继承 keras.layers.Layer 类来自定义层。 以下是一个简单的例子,展示如何使用 Keras 自定义层类: ```python import tensorflow as tf from tensorflow import keras class MyLayer(keras.layers.Layer): def __init__(self, output_dim, **kwargs): self.output_dim = output_dim super(MyLayer, self).__init__(**kwargs) def build(self, input_shape): self.kernel = self.add_weight(name='kernel', shape=(input_shape[1], self.output_dim), initializer='uniform', trainable=True) super(MyLayer, self).build(input_shape) def call(self, inputs): return tf.matmul(inputs, self.kernel) def compute_output_shape(self, input_shape): return (input_shape[0], self.output_dim) ``` 在上面的代码中,我们定义了一个名为 MyLayer自定义层类。该层包含一个内部实现,用于将输入张量与内部权重矩阵相乘,以产生输出张量。在这个例子中,我们使用了 TensorFlow 的 matmul 函数来实现这个操作。 我们还实现了两个必需的方法:build 和 compute_output_shape。build 方法用于初始化内部权重,并将它们添加到层中。compute_output_shape 方法用于确定输出张量的形状。 要使用自定义层,您可以像使用任何其他层一样使用它。例如: ```python model = keras.Sequential([ MyLayer(10, input_shape=(784,)), keras.layers.Activation('softmax'), ]) ``` 在上面的代码中,我们创建了一个顺序模型,并将 MyLayer 作为第一层添加到模型中。然后,我们添加了一个 softmax 激活层,以便产生最终输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值