【发布时间】: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