Тензорный поток, позволяющий уменьшать градиенты для определенных элементов данных

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