Как я могу удалить потерю, добавленную с помощью add_loss()

#tensorflow #keras

Вопрос:

Если я создам модель, а затем использую add_loss :

 model.add_loss(myLoss1(...))
 

И позже хотел бы использовать другую потерю на той же модели, как я могу, например, удалить myLoss1 и заменить ее myLoss2 ?

Я пытался model.losses.clear() , но это, похоже, не помогло. Я знаю, что мог бы сохранить веса на диск, переделать модель с нужной потерей и перезагрузить веса, но это похоже на взлом.

Ответ №1:

Вы можете создать новую модель, используя конфигурацию существующей модели, а затем add_loss() снова позвонить, чтобы установить новые потери. То же самое касается восстановления весов моделей.

 weights = model.get_weights()

# Instantiate model again to remove old loss
model = model.from_config(model.get_config())
model.set_weights(weights)

# Set new loss
model.add_loss(myLoss2(...))
 

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

 # For Tensorflow's Keras
tf.keras.backend.clear_session()

# For Standalone Keras
keras.backend.clear_session()
 

Ответ №2:

model.losses не влияет на модель или график, он вернет вам только временно сгенерированный список, а model.losses.clear() только очистит список, что не повлияет на модель.
Кроме того, вам придется каждый раз перекомпилировать модель, но нет необходимости сохранять веса на диск. Вы можете сделать это ниже

 import numpy as np
import tensorflow as tf

from tensorflow.keras.layers import Dense, Input
from tensorflow.keras import Model


x = np.random.rand(100).reshape(100, 1).astype(float)
y = np.array(x > 0.5).reshape(100, 1).astype(float)

input_x = Input(shape=(1,), name='input')
d1 = Dense(12, name='d11')(input_x)
d1 = Dense(12, name='d12')(d1)
d1 = Dense(1, name='output1')(d1)
label = Input(shape=(1,), name='label')

model = Model(inputs=[input_x, label], outputs=d1)


def loss1(yi, yp):
    loss = tf.reduce_mean((yi - yp) ** 2)
    return loss


def loss2(yi, yp):
    loss = tf.reduce_mean((yi - yp) ** 2) * 2

    return loss


model.add_loss(loss1(label, d1))
optimizer = tf.compat.v1.train.AdamOptimizer(3e-4)
model.compile(optimizer, loss=None)
model.fit({'input': x, 'label': y}, None, epochs=100)

# reset model
weights = model.get_weights()
model = Model(inputs=[input_x, label], outputs=d1)
model.add_loss(loss2(label, d1))
optimizer = tf.compat.v1.train.AdamOptimizer(3e-4)
model.compile(optimizer, loss=None)
model.set_weights(weights)
model.fit({'input': x, 'label': y}, None, epochs=100)
 

Ответ №3:

Просто добавьте негатив обратно.

 # Existing code
model.add_loss(myLoss1(...))

# New code
model.add_loss(-myLoss1(...))