web-dev-qa-db-ja.com

TF2.0でカスタムグラデーションを使用してケラスレイヤーを作成する方法

tensorFlow 2.0では、Keras(私はあまり詳しくありません)ですべての高レベルAPIを統合し、Sessionsを完全に削除することを計画しているので、私は疑問に思いました:

カスタムグラデーションを持つカスタムケラスレイヤーを作成するにはどうすればよいですか?

(かなり制限された) ガイド をケラスでカスタムレイヤーを作成する方法について見てきましたが、操作にカスタムグラデーションを設定したい場合の対処方法は説明されていません。

9
ILM91

まず、kerasの下でのAPIの「統一」(呼び出し)は、TensorFlow 1.xで行ったようなことを妨げません。セッションがなくなった可能性がありますが、python関数のようにモデルを定義して、ケラなしで熱心にトレーニングすることができます(つまり、 tf.GradientTape を通じて))

ここで、カスタムレイヤーを実行し、カスタムオペレーションを実行し、カスタムグラデーション、次の操作を行う必要があります。

a)カスタム操作を実行し、カスタムグラデーションを定義する関数を記述します。これを行う方法の詳細 ここ

@tf.custom_gradient
def custom_op(x):
    result = ... # do forward computation
    def custom_grad(dy):
        grad = ... # compute gradient
        return grad
    return result, custom_grad

関数では、xdyをテンソルとして扱い、notnumpy配列を扱う必要があることに注意してください(つまり、テンソル演算を実行します)

b)custom_opを実行するカスタムkerasレイヤーを作成します。この例では、レイヤーにトレーニング可能なパラメーターがないか、その入力の形状を変更していないと仮定しますが、そうしてもそれほど大きな違いはありません。そのためには、投稿したガイド this one を参照してください。

class CustomLayer(tf.keras.layers.Layer):
    def __init__(self):
        super(CustomLayer, self).__init__()

    def call(self, x):
        return custom_op(x)  # you don't need to explicitly define the custom gradient
                             # as long as you registered it with the previous method

これで、このレイヤーをケラスモデルで使用でき、機能します。例えば:

inp = tf.keras.layers.Input(input_shape)
conv = tf.keras.layers.Conv2D(...)(inp)  # add params like the number of filters
cust = CustomLayer()(conv)  # no parameters in custom layer
flat = tf.keras.layers.Flatten()(cust)
fc = tf.keras.layers.Dense(num_classes)(flat)

model = tf.keras.models.Model(inputs=[inp], outputs=[fc])
model.compile(loss=..., optimizer=...)  # add loss function and optimizer
model.fit(...)  # fit the model
13
Djib2011