Пользовательский бинаризованный (пороговый) слой изображения в TensorFlow 2.2 - PullRequest
0 голосов
/ 28 мая 2020

Я создаю 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», но ошибка не исчезла.

...