tf.kerasでcustom layerを書いていた時、ある確率でランダムに水増しを行う関数を書いていた。
model.fitを実行した際に表題のエラーが発生。
OperatorNotAllowedInGraphError: using a `tf.Tensor` as a Python `bool` is not allowed: AutoGraph did convert this function. This might indicate you are trying to use an unsupported feature.
AutoGraphではif文を解釈出来ないらしい。
AutoGraphの条件分岐に関するチュートリアルを見てみる。
tf.function で性能アップ | TensorFlow Core
if文を書く代わりに、tf.condで条件分岐をするらしい。
tf.cond | TensorFlow v2.16.1
Return true_fn() if the predicate pred is true else false_fn().
tf.cond(
pred, true_fn=None, false_fn=None, name=None
)Args
pred A scalar determining whether to return the result of true_fn or false_fn.
true_fn The callable to be performed if pred is true.
false_fn The callable to be performed if pred is false.
name Optional name prefix for the returned tensors.
if文の代わりにtf.condを使ってcustom layerを書くと、上手くmodel.fit出来るようになった。
下記の例では75%の確率で入力を2倍するレイヤーとして働く。
class CustomLayer(tf.keras.layers.Layer):
def __init__(self, **kwargs):
super(CustomLayer, self).__init__()
def call(self, inputs):
def true_fn(x):
return x * 2
prob = tf.random.uniform([], 0, 1) < 0.75
return tf.cond(prob,
true_fn=lambda: true_fn(inputs),
false_fn=lambda: tf.identity(inputs))
参考
How to wrap tf.cond function with keras.layers.Lambda?
I'm trying to define a custom layer in keras,but I can't find a way to warp tf.cond with layers.Lambda function matches ...
コメント