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)重的乘積之和。
首先,讓我們導(dǎo)入必要的模塊:
from keras import backend as K
from keras.layers import Layer
dot
函數(shù)。讓我們創(chuàng)建一個新類MyCustomLayer
通過子類化 Layer
類:
class MyCustomLayer(Layer):
...
讓我們初始化我們的新類,如下所示:
def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(MyCustomLayer, self).__init__(**kwargs)
init
函數(shù)。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)
input_shape
的構(gòu)建方法。輸入數(shù)據(jù)的形狀由 input_shape
引用。build
方法。call
方法在訓(xùn)練過程中執(zhí)行該層的確切工作。
我們自定義的調(diào)用方法如下:
def call(self, input_data):
return K.dot(input_data, self.kernel)
input_data
的call
方法。input_data
是我們層的輸入數(shù)據(jù)。input_data
和我們層的內(nèi)核self.kernel
的點積def compute_output_shape(self, input_shape):
return (input_shape[0], self.output_dim)
input_shape
的compute_output_shape
方法
實現(xiàn)build
、call
和compute_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
_________________________________________________________________
更多建議: