Keras - 自定义层

Keras 允许创建我们自己的自定义层。一旦创建新层,它就可以在任何模型中使用,没有任何限制。让我们在本章中学习如何创建新层。

Keras 提供了一个基础类 Layer,它可以子类化以创建我们自己的自定义层。让我们创建一个简单的层,它将根据正态分布找到权重,然后在训练期间进行基本计算,找到输入与其权重乘积的总和。

步骤 1:导入必要的模块

首先,让我们导入必要的模块 −

from keras import backend as K
from keras.layers import Layer

这里,

  • backend 用于访问 dot 函数。

  • Layer 是基类,我们将对其进行子类化以创建我们的层

步骤 2:定义层类

让我们通过创建一个新类 MyCustomLayer子类化 Layer 类

class MyCustomLayer(Layer):
...

步骤 3:初始化层类

让我们按照以下指定的方式初始化我们的新类 −

def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(MyCustomLayer, self).__init__(**kwargs)

此处,

  • 第 2 行设置输出维度。

  • 第 3 行调用基础层或超层的 init 函数。

步骤4:实现 build 方法

build 是主要方法,其唯一目的是正确构建层。它可以执行与层内部工作相关的任何操作。自定义功能完成后,我们可以调用基类 build 函数。我们的自定义 build 函数如下 −

def build(self, input_shape): 
   self.kernel = self.add_weight(name = 'kernel', 
      shape = (input_shape[1], self.output_dim), 
      initializer = 'normal', trainable = True) 
   super(MyCustomLayer, self).build(input_shape)

此处,

  • 第 1 行 定义了 build 方法,该方法有一个参数,即 input_shape。输入数据的形状由 input_shape 引用。

  • 第 2 行 创建与输入形状对应的权重并将其设置在内核中。这是我们对层的自定义功能。它使用"正常"初始化程序创建权重。

  • 第 6 行调用基类 build 方法。

步骤 5:实现调用方法

call 方法在训练过程中执行层的确切工作。

我们的自定义 call 方法如下

def call(self, input_data):
return K.dot(input_data, self.kernel)

这里,

  • 第 1 行 定义 call 方法,它有一个参数 input_data。 input_data 是我们层的输入数据。

  • 第 2 行 返回输入数据 input_data 和我们层的内核 self.kernel

步骤 6:实现 compute_output_shape 方法

def compute_output_shape(self, input_shape): return (input_shape[0], self.output_dim)

这里,

  • 第 1 行 定义 compute_output_shape 方法,带有一个参数 input_shape

  • 第 2 行 使用输入数据的形状和输出维度集计算输出形状,同时初始化层。

实现build、callcompute_output_shape,完成自定义层的创建。最终完整代码如下

from keras import backend as K from keras.layers import Layer
class MyCustomLayer(Layer): 
   def __init__(self, output_dim, **kwargs): 
      self.output_dim = output_dim 
      super(MyCustomLayer, self).__init__(**kwargs) 
   def build(self, input_shape): self.kernel = 
      self.add_weight(name = 'kernel', 
      shape = (input_shape[1], self.output_dim), 
      initializer = 'normal', trainable = True) 
      super(MyCustomLayer, self).build(input_shape) # 
      Be sure to call this at the end 
   def call(self, input_data): return K.dot(input_data, self.kernel) 
   def compute_output_shape(self, input_shape): return (input_shape[0], self.output_dim)

使用我们的自定义层

让我们使用下面指定的自定义层创建一个简单的模型 −

from keras.models import Sequential
from keras.layers import Dense

model = Sequential()
model.add(MyCustomLayer(32, input_shape = (16,)))
model.add(Dense(8,activation = 'softmax')) model.summary()

这里,

  • 我们的 MyCustomLayer 使用 32 个单元和 (16,) 作为输入形状添加到模型中

运行应用程序将打印模型摘要,如下所示 −

Model: "sequential_1" 
_________________________________________________________________ 
Layer (type) Output Shape Param 
#================================================================ 
my_custom_layer_1 (MyCustomL (None, 32) 512 
_________________________________________________________________
dense_1 (Dense) (None, 8) 264 
================================================================= 
Total params: 776 
Trainable params: 776 
Non-trainable params: 0 
_________________________________________________________________