#tensorflow #keras #gradient
Вопрос:
Допустим, у меня есть модель с несколькими выходами с выходами y_0 и y_1. Для некоторых примеров данных я уверен, что y_0 верен, но знаю, что y_1 может быть полным предположением. Моя идея состояла в том, чтобы использовать пользовательский цикл обучения и умножить его на расчетный вес, но это, похоже, не работает. Есть ли способ сделать это через api keras, который может быть проще, чем этот?
@tf.function
def train_on_batch(x,y):
y_true = y[:, 0]
weights = y[:,1]
with tf.GradientTape() as tape:
y_pred = model(x, training=True)
print("ytrainpred ", y_pred)
loss_value_pre = loss(y_true, y_pred)
loss_value = loss_value_pre * weights
# compute gradient
grads = tape.gradient(loss_value, model.trainable_weights)
# update weights
optimizer.apply_gradients(zip(grads, model.trainable_weights))
# update metrics
loss_1_train.update_state(y_true[:, 0], loss_value[:,0])
loss_2_train.update_state(y_true[:, 1], loss_value[:,1)
return loss_value
Ответ №1:
При компиляции метода объекта keras у вас есть параметр, называемый весами потерь, для этого вам нужно только реализовать функции потерь, которые принимают тот или иной вывод и передаются в виде массива потерь параметру потерь, но это становится совершенно непрактичным, если у вас много ys
Комментарии:
1. Проблема, которую я вижу в этом, заключается в том, что, хотя вы можете установить веса для определенных выходных переменных, вы не можете сделать это для отдельных элементов данных.