Keras 自定義層

2021-10-15 14:50 更新

Keras 允許創(chuàng)建我們自己的自定義層。一旦創(chuàng)建了一個新層,它就可以在任何模型中使用而不受任何限制。讓我們在本章中學(xué)習(xí)如何創(chuàng)建新層。

Keras 提供了一個基礎(chǔ)類,Layer 可以對其進(jìn)行子類化以創(chuàng)建我們自己的自定義層。讓我們創(chuàng)建一個簡單的層,它會根據(jù)正態(tài)分布找到權(quán)重,然后在訓(xùn)練期間進(jìn)行基本計算,找到輸入與權(quán)重的乘積之和。

第 1 步:導(dǎo)入必要的模塊

首先,讓我們導(dǎo)入必要的模塊:

from keras import backend as K 
from keras.layers import Layer
  • backend (后端):用于訪問dot函數(shù)。
  • layer (層):是基類,我們將對其進(jìn)行子類化以創(chuàng)建我們的層

第 2 步:定義一個圖層類

讓我們創(chuàng)建一個新類MyCustomLayer通過子類化 Layer 類:

class MyCustomLayer(Layer): 
   ...

第 3 步:初始化圖層類

讓我們初始化我們的新類,如下所示:

def __init__(self, output_dim, **kwargs):    
   self.output_dim = output_dim 
   super(MyCustomLayer, self).__init__(**kwargs)
  • 第 2 行 設(shè)置輸出維度。
  • 第 3 行 調(diào)用基礎(chǔ)層或超層的 init 函數(shù)。

第 4 步:實現(xiàn)構(gòu)建方法

build是主要方法,其唯一目的是正確構(gòu)建層。它可以做任何與層的內(nèi)部工作相關(guān)的事情。自定義功能完成后,我們可以調(diào)用基類構(gòu)建函數(shù)。我們的自定義構(gòu)建功能如下:

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 行 定義了帶有一個參數(shù)input_shape的構(gòu)建方法。輸入數(shù)據(jù)的形狀由 input_shape 引用。
  • 第 2 行 創(chuàng)建對應(yīng)于輸入形狀的權(quán)重并將其設(shè)置在內(nèi)核中。這是我們對圖層的自定義功能。它使用“正?!背跏蓟绦騽?chuàng)建權(quán)重。
  • 第 6 行調(diào)用基類build方法。

第 5 步:實現(xiàn)call方法

call方法在訓(xùn)練過程中執(zhí)行該層的確切工作。 我們自定義的調(diào)用方法如下:

def call(self, input_data): 
   return K.dot(input_data, self.kernel)
  • 第 1 行 定義了帶有一個參數(shù)input_datacall方法。input_data 是我們層的輸入數(shù)據(jù)。
  • 第 2 行 返回輸入數(shù)據(jù)input_data和我們層的內(nèi)核self.kernel的點積

第 6 步:實現(xiàn)compute_output_shape方法

def compute_output_shape(self, input_shape): 
    return (input_shape[0], self.output_dim)
  • 第 1 行 定義了帶有一個參數(shù)input_shapecompute_output_shape方法
  • 第 2 行 在初始化層時使用輸入數(shù)據(jù)的形狀和輸出維度集計算輸出形狀。

實現(xiàn)build、callcompute_output_shape 就完成了自定義層的創(chuàng)建。最終完整的代碼如下:

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)

使用我們的定制層

讓我們使用我們的自定義層創(chuàng)建一個簡單的模型,如下所示:

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,)作為輸入形狀添加到模型中

運(yùn)行應(yīng)用程序?qū)⒋蛴∧P驼缦?

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 
_________________________________________________________________
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號