web-dev-qa-db-ja.com

Keras Concatenate Layers:異なるタイプの連結関数の違い

最近、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()など。

9
Lim Kaizhuo

最初に、バックエンド: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
_

その後、Layerkeras.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の更新の場合、このコードは壊れますが、適切なコードは問題ありません)

10
Daniel Möller

Kerasは、歴史的に2つの異なるインターフェイスをサポートしています。新しい機能と古い機能です。これらはmodel.add()呼び出しを必要とするため、2つの異なる機能です。

TFの場合、concatenate()関数は、Kerasが機能するために必要なすべてを実行するわけではありません。したがって、._keras_shape変数は正しいが、その変数が何らかの特定の値を持つことを期待するKerasを混乱させない。

1
lenik