在Keras中使用自定义步骤激活功能会导致“操作没有梯度梯度的操作”。错误。如何解决呢?

时间:2019-02-11 14:29:30

标签: python tensorflow keras gradient activation-function

我正在构建自动编码器,我想将我的值编码为逻辑矩阵。但是,当我在其中一个中间层(所有其他层都使用“ relu”)中使用自定义步骤激活功能时,keras会引发此错误:

An operation has `None` for gradient.

我尝试使用hard-sigmoid函数,但是它不适合我的问题,因为当我只需要二进制文件时,它仍然会产生中间值。我知道,我的函数在大多数时候都没有梯度,但是是否可以使用其他函数进行梯度计算,而仍然使用阶跃函数进行精度和损耗计算?

我的激活功能:

def binary_activation(x):
    ones = tf.ones(tf.shape(x), dtype=x.dtype.base_dtype)
    zeros = tf.zeros(tf.shape(x), dtype=x.dtype.base_dtype)
    return keras.backend.switch(x > 0.5, ones, zeros)

我希望能够使用二进制步进激活功能来训练网络,然后将其用作典型的自动编码器。 this paper中使用的类似于二进制特征图的东西。

1 个答案:

答案 0 :(得分:1)

here所述,您可以使用tf.custom_gradient为激活函数定义一个“向后传播”的梯度。

也许是这样的:

@tf.custom_gradient
def binary_activation(x):

    ones = tf.ones(tf.shape(x), dtype=x.dtype.base_dtype)
    zeros = tf.zeros(tf.shape(x), dtype=x.dtype.base_dtype)

    def grad(dy):
        return ...  # TODO define gradient
  return keras.backend.switch(x > 0.5, ones, zeros), grad