【问题标题】:How to force a bottleneck in an autoencoder to produce binary values?如何强制自动编码器中的瓶颈产生二进制值?
【发布时间】:2020-07-01 11:05:57
【问题描述】:

我尝试强制自动编码器中的瓶颈层生成二进制值。我通过在自定义损失函数中使用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

【问题讨论】:

  • 非常慢是什么意思?花太多时间来收敛,减慢你的训练过程? (即现在需要更多时间来做一个时代)。对于第一个问题,我想一个选择是通过将binarize_loss 函数乘以 > 1 的常数来增加权重。
  • 二值化函数的影响无论如何都是通过权重来调节的,并且随着时间的推移而增加。然而,每个 epoch 的训练过程要慢得多。对于该层中的每个值,Tensorflow 必须在两种情况之间进行分支。这在训练期间非常耗时,因为 GPU 似乎不是为分支而设计的。也许有更精简的、GPU 友好的功能可能?有什么想法吗?

标签: tensorflow keras autoencoder loss-function


【解决方案1】:

我可能会摆脱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)

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

【讨论】:

  • 非常感谢!多么漂亮的简单解决方案。羞愧的双面手掌。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
  • 2018-10-15
相关资源
最近更新 更多