Tensorflow 如何强制自动编码器中的瓶颈生成二进制值?

Tensorflow 如何强制自动编码器中的瓶颈生成二进制值?,tensorflow,keras,autoencoder,loss-function,Tensorflow,Keras,Autoencoder,Loss Function,我试图强制自动编码器中的瓶颈层生成二进制值。我在自定义损失函数中使用tensorflow.cond,惩罚所有不是0或1的值。然而,这种方法是非常缓慢的。有没有更好的方法来执行此操作 def custom_loss(weight): def loss(y_true, y_pred): reconstruction_loss = binary_crossentropy(y_true, y_pred) def binarize_loss(value):

我试图强制自动编码器中的瓶颈层生成二进制值。我在自定义损失函数中使用
tensorflow.cond
,惩罚所有不是0或1的值。然而,这种方法是非常缓慢的。有没有更好的方法来执行此操作

def custom_loss(weight):
    def loss(y_true, y_pred):
        reconstruction_loss = binary_crossentropy(y_true, y_pred)

        def binarize_loss(value):
            return tf.cond(tf.reduce_mean(value) > 0.5, lambda: tf.abs(value - 1), lambda: tf.abs(value))

        binarized_loss_value = tf.map_fn(binarize_loss, neckLayer.output)
        return reconstruction_loss + (K.mean(binarized_loss_value , axis=-1) * weight)

    return loss

我可能会去掉
tf.cond
语句,因为您可以通过使用简单的算术来做您想做的事情:

def loss(y_true, y_pred):
        reconstruction_loss = binary_crossentropy(y_true, y_pred)

        binary_neck_loss = tf.abs(0.5 - tf.abs(0.5 - neckLayer.output))

        return reconstruction_loss + (K.mean(binary_neck_loss , axis=-1) * weight)

当然,我不知道你的数据的确切形状,但你应该能够从那里推断

你说的非常慢是什么意思?花太多的时间去集中精力,减慢你的训练过程?(也就是说,现在做一个划时代需要更多的时间)。对于第一个问题,我想一种选择是将
二值化_loss
函数乘以一个常数>1,从而为其增加更多的权重。二值化函数的影响无论如何都是通过权重来调节的,并且随着时间的推移而增加。然而,每个历元的训练过程要慢得多。对于该层中的每个值,Tensorflow必须在两种情况之间进行分支。这在培训过程中相当耗时,因为GPU似乎不是用于分支的。也许有一个更精简,GPU友好的功能可能?有什么想法吗?非常感谢!多么简单的解决方案啊。羞愧的双面手掌。