我正在构建自动编码器,我想将我的值编码为逻辑矩阵。但是,当我在其中一个中间层(所有其他层都使用“ 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中使用的类似于二进制特征图的东西。
答案 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