Я создаю CNN в Tensorflow, вывод которого должен быть двоичным изображением (0, 1). Я хотел бы реализовать настраиваемый уровень с одной настраиваемой переменной (порогом), которая будет форматировать окончательное изображение, например:
>>> a
array([[ 0.02 , 0.833, 0.778, 0.87 ],
[ 0.979, 0.799, 0.461, 0.781],
[ 0.118, 0.64 , 0.143, 0.945],
[ 0.522, 0.415, 0.265, 0.774]])
>>> np.where(a > threshold, 1, 0)
array([[0, 1, 1, 1],
[1, 1, 0, 1],
[0, 1, 0, 1],
[1, 0, 0, 1]])
Я попытался реализовать это как:
class BinarizeLayer(keras.layers.Layer):
def __init__(self, **kwargs):
super(BinarizeLayer, self).__init__(**kwargs)
self.threshold = tf.Variable(initial_value=0.5, dtype=tf.float32, name='BinaryThreshold')
def call(self, x):
cond = tf.math.less(x, tf.fill(tf.shape(x), self.threshold))
out = tf.where(cond, tf.zeros(tf.shape(x)), tf.ones(tf.shape(x)))
return out
Однако это приводит к ValueError: An operation has 'None' for gradient.
. Есть ли способ обойти это? Я попытался добавить tf.stop_gradient () ко всем частям «call», но ошибка не исчезла.