Я хочу использовать расстояние извлеченных признаков модели как часть функции потерь, аналогично тому, что описано в этой статье о потерях восприятия.
Я в основном использую Keras с Tensorflow в качестве бэкэнда. Если бы у меня была предварительно обученная модель Keras, я мог бы использовать ее вывод как часть пользовательской потери, например: (пример взят из кода GAN, но я не думаю, что это потеря универсальности)
discriminator = DiscriminatorCNN(...) #returns Keras Model
discriminator.compile(...)
def adversary_loss_factory(discriminator):
def adversary_loss(y_true, y_pred):
prediction = discriminator(y_pred)
prediction = -1 * K.log(prediction)
return prediction
return adversary_loss
И тогда adversary_loss может быть использован как потеря другой модели.
Моя проблема в том, что конкретная предварительно обученная модель, которую я использую, доступна только как модель Tensorflow. Я подумал, что это можно сделать, так как это тот же самый бэкэнд, но я не уверен, с чего начать.
Я использую код в этом хранилище , и кажется, что вы можете получить слой внедрения через этот код после правильной загрузки модели:
embeddings = tf.get_default_graph().get_tensor_by_name("embeddings:0")
Я знаю, что вы можете затем использовать sess.run, чтобы получить вложения для определенного пакета, но это не кажется дифференцируемым, так как это приводит к пользовательской потере. Есть ли способ превратить эти вложения в функцию, подобную модели Кераса?