📜  Keras-定制层

📅  最后修改于: 2020-12-11 04:56:30             🧑  作者: Mango


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

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

步骤1:导入必要的模块

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

from keras import backend as K 
from keras.layers import 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行创建对应于输入形状的权重并将其设置在内核中。这是我们层的自定义功能。它使用“普通”初始化程序创建权重。

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

步骤5:实现调用方法

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

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

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_shape定义了compute_output_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 
_________________________________________________________________