Keras-customized-layer

提供:Dev Guides
移動先:案内検索

Keras-カスタマイズされたレイヤー

Kerasでは、独自のカスタマイズされたレイヤーを作成できます。 新しいレイヤーが作成されると、制限なしに任意のモデルで使用できます。 この章では、新しいレイヤーを作成する方法を学びましょう。

Kerasはベース layer クラスを提供します。これは、独自にカスタマイズされたレイヤーを作成するためにサブクラス化できるレイヤーです。 正規分布に基づいて重みを見つける単純なレイヤーを作成して、トレーニング中に入力とその重みの積の合計を求める基本的な計算を行います。

ステップ1:必要なモジュールをインポートする

まず、必要なモジュールをインポートしましょう-

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

ここに、

  • backenddot 関数にアクセスするために使用されます。
  • Layer は基本クラスであり、サブクラス化してレイヤーを作成します

ステップ2:レイヤークラスを定義する

*MyCustomLayer* をサブクラス化して *MyCustomLayer* を作成しましょう *Layer class* -
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行目*は、* build_メソッドを1つの引数 input_shape で定義しています。 入力データの形状はinput_shapeで参照されます。
  • *行2 *は、入力形状に対応する重みを作成し、カーネルに設定します。 これは、レイヤーのカスタム機能です。 「通常」のイニシャライザを使用して重みを作成します。
  • * 6行目*は、基本クラスの build メソッドを呼び出します。

ステップ5:呼び出しメソッドを実装する

*call* メソッドは、トレーニングプロセス中にレイヤーを正確に処理します。

カスタム call メソッドは次のとおりです

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

ここに、

  • 行1 *は、 *call メソッドを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 *は、 *compute_output_shape メソッドを1つの引数 input_shape で定義しています

  • *行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
_________________________________________________________________