Keras-カスタマイズされたレイヤー
Kerasを使用すると、独自にカスタマイズしたレイヤーを作成できます。新しいレイヤーが作成されると、制限なしで任意のモデルで使用できます。この章では、新しいレイヤーを作成する方法を学びましょう。
Kerasはベースを提供します layerクラス、独自のカスタマイズされたレイヤーを作成するためにサブクラス化できるレイヤー。正規分布に基づいて重みを見つける単純なレイヤーを作成してから、トレーニング中に入力とその重みの積の合計を見つける基本的な計算を行います。
ステップ1:必要なモジュールをインポートする
まず、必要なモジュールをインポートしましょう-
from keras import backend as K
from keras.layers import Layer
ここに、
backend アクセスするために使用されます dot 関数。
Layer は基本クラスであり、レイヤーを作成するためにサブクラス化します。
ステップ2:レイヤークラスを定義する
新しいクラスを作成しましょう、 MyCustomLayer サブクラス化による Layer class −
class MyCustomLayer(Layer):
...
ステップ3:レイヤークラスを初期化する
以下に指定するように、新しいクラスを初期化します。
def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(MyCustomLayer, self).__init__(**kwargs)
ここに、
Line 2 出力次元を設定します。
Line 3 ベースレイヤーまたはスーパーレイヤーを呼び出します init 関数。
ステップ4:ビルドメソッドを実装する
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)
ここに、
Line 1 を定義します build 1つの引数を持つメソッド、 input_shape。入力データの形状はinput_shapeによって参照されます。
Line 2入力形状に対応するウェイトを作成し、カーネルに設定します。これは、レイヤーのカスタム機能です。'normal'イニシャライザを使用して重みを作成します。
Line 6 基本クラスを呼び出し、 build 方法。
ステップ5:呼び出しメソッドを実装する
call メソッドは、トレーニングプロセス中にレイヤーの正確な動作を行います。
私たちの習慣 call 方法は以下の通りです
def call(self, input_data):
return K.dot(input_data, self.kernel)
ここに、
Line 1 を定義します call 1つの引数を持つメソッド、 input_data。input_dataは、レイヤーの入力データです。
Line 2 入力データの内積を返し、 input_data そして私たちのレイヤーのカーネル、 self.kernel
ステップ6:compute_output_shapeメソッドを実装する
def compute_output_shape(self, input_shape): return (input_shape[0], self.output_dim)
ここに、
Line 1 定義する compute_output_shape 1つの引数を持つメソッド input_shape
Line 2 レイヤーの初期化中に、入力データの形状と出力寸法セットを使用して出力形状を計算します。
の実装 build, call そして compute_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
_________________________________________________________________