Keras – 自定义图层

Keras – 自定义图层

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

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

第1步:导入必要的模块

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

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

这里、

  • backend ** 被用来访问 **点函数

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

第2步:定义一个图层类

让我们通过对 Layer类 的子类化来创建一个新的类, MyCustomLayer --

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 是主方法,它的唯一目的是正确地建立层。它可以做任何与层的内部工作有关的事情。一旦自定义功能完成,我们就可以调用基类的 构建 函数。我们的自定义 构建 函数如下

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行 定义了有一个参数的 构建 方法,即 input_shape。 输入数据的形状是由input_shape指代的。

  • 第2行 创建与输入形状相对应的权重,并将其设置在内核中。这是我们对该层的自定义功能。它使用 “normal “初始化器创建权重。

  • 第 6行 调用基类, 建立 方法。

第5步:实现调用方法

调用 方法在训练过程中完成层的具体工作。

我们的自定义 调用 方法如下

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

这里、

  • 第1行 定义了有一个参数 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行 定义了带有一个参数 input_shapecomputeoutput_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 
_________________________________________________________________

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程