Как заставить узкое место в автоэнкодере генерировать двоичные значения? - PullRequest
1 голос
/ 20 марта 2020

Я пытаюсь заставить слой узкого места в автоэнкодере генерировать двоичные значения. Я делаю это, используя 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

1 Ответ

1 голос
/ 20 марта 2020

Я бы, вероятно, избавился от оператора tf.cond, поскольку вы можете делать то, что вы хотите, используя простую арифметику c:

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)

Конечно, я не знаю точно форму ваших данных, но вы должны быть в состоянии экстраполировать оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...