tensorFlow 2.0では、Keras(私はあまり詳しくありません)ですべての高レベルAPIを統合し、Sessionsを完全に削除することを計画しているので、私は疑問に思いました:
カスタムグラデーションを持つカスタムケラスレイヤーを作成するにはどうすればよいですか?
(かなり制限された) ガイド をケラスでカスタムレイヤーを作成する方法について見てきましたが、操作にカスタムグラデーションを設定したい場合の対処方法は説明されていません。
まず、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
関数では、x
とdy
をテンソルとして扱い、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