最近、Kerasをいじり始め、カスタムレイヤーを作成しました。ただし、名前がわずかに異なるが同じ機能を備えたさまざまなタイプのレイヤーにかなり混乱しています。
たとえば、 https://keras.io/layers/merge/ および https://www.tensorflow.org/api_docs/pythonからの連結関数には3つの異なる形式があります/ tf/keras/backend/concatenate
keras.layers.Concatenate(axis=-1)
keras.layers.concatenate(inputs, axis=-1)
tf.keras.backend.concatenate()
2番目のAPIが機能APIに使用されていることは知っていますが、3つのAPIの違いは何ですか?これについてのドキュメントは少し不明瞭に思えます。
また、3番目のものについては、以下でこれを行うコードを見ました。連結後に._keras_shapeの行が必要なのはなぜですか?
# Concatenate the summed atom and bond features
atoms_bonds_features = K.concatenate([atoms, summed_bond_features], axis=-1)
# Compute fingerprint
atoms_bonds_features._keras_shape = (None, max_atoms, num_atom_features + num_bond_features)
最後に、keras.layersの下には、常に2つの重複があるようです。たとえば、Add()やadd()など。
最初に、バックエンド:tf.keras.backend.concatenate()
バックエンド関数は「内部」レイヤーで使用されることになっています。これは、Lambda
レイヤー、カスタムレイヤー、カスタム損失関数、カスタムメトリックなどでのみ使用します。
「テンソル」で直接動作します。
あなたがカスタマイズに深く行っていない場合、それは選択ではありません。 (そして、それはあなたの例のコードでは悪い選択でした-最後に詳細を見てください)。
Kerasコードを詳しく調べると、Concatenate
レイヤーがこの関数を内部で使用していることに気付くでしょう。
_import keras.backend as K
class Concatenate(_Merge):
#blablabla
def _merge_function(self, inputs):
return K.concatenate(inputs, axis=self.axis)
#blablabla
_
その後、Layer
:keras.layers.Concatenate(axis=-1)
他のkerasレイヤーと同様に、instantiateおよびcall it on tensors。
かなり簡単です:
_#in a functional API model:
inputTensor1 = Input(shape) #or some tensor coming out of any other layer
inputTensor2 = Input(shape2) #or some tensor coming out of any other layer
#first parentheses are creating an instance of the layer
#second parentheses are "calling" the layer on the input tensors
outputTensor = keras.layers.Concatenate(axis=someAxis)([inputTensor1, inputTensor2])
_
前のレイヤーがリストを出力しない限り、これはシーケンシャルモデルには適していません(これは可能ですが、一般的ではありません)。
最後に、layersモジュールの連結関数:keras.layers.concatenate(inputs, axis=-1)
これはレイヤーではないです。これは、内部Concatenate
レイヤーによって生成されたテンソルを返す関数です。
コードは簡単です:
_def concatenate(inputs, axis=-1, **kwargs):
#blablabla
return Concatenate(axis=axis, **kwargs)(inputs)
_
Keras 1には、入力として「レイヤー」を受け取り、出力「レイヤー」を返すことを目的とした関数がありました。それらの名前はmerge
Wordに関連していました。
しかし、Keras 2ではこれらについて言及または文書化されていないため、おそらくそれらの使用を避け、古いコードが見つかった場合は、適切なKeras 2コードに更新するでしょう。
_keras_shape
_という単語なのですか?このバックエンド関数は、高レベルのコードで使用されることを想定していませんでした。コーダーはConcatenate
レイヤーを使用する必要がありました。
_atoms_bonds_features = Concatenate(axis=-1)([atoms, summed_bond_features])
#just this line is perfect
_
Kerasレイヤーは__keras_shape
_プロパティをすべての出力テンソルに追加し、Kerasはこのプロパティを使用してモデル全体の形状を推測します。
レイヤーまたは損失/メトリックの「外部」でバックエンド関数を使用すると、出力テンソルにこのプロパティがなくなり、__keras_shape
_が存在しないことを示すエラーが表示されます。
コーダーは、適切なkerasレイヤーによって追加されるべきプロパティを手動で追加することにより、悪い回避策を作成しています。 (これで動作するかもしれませんが、kerasの更新の場合、このコードは壊れますが、適切なコードは問題ありません)
Kerasは、歴史的に2つの異なるインターフェイスをサポートしています。新しい機能と古い機能です。これらはmodel.add()
呼び出しを必要とするため、2つの異なる機能です。
TFの場合、concatenate()
関数は、Kerasが機能するために必要なすべてを実行するわけではありません。したがって、._keras_shape
変数は正しいが、その変数が何らかの特定の値を持つことを期待するKerasを混乱させない。