Я хотел бы реализовать в TensorFlow технику «управляемого обратного распространения», представленную в этом Paper и описанную в этом recipe.Ведомое обратное распространение в TensorFlow
Вычислительно, что означает, что когда я вычисляю градиент, например, входной сигнал. выход NN, я должен будет изменить градиенты, вычисленные в каждом блоке RELU. Конкретно, обратный сигнал на этих устройствах должен быть установлен на ноль, чтобы этот метод работал. Другими словами, частную производную от RELU, отрицательных, следует игнорировать.
Учитывая, что я заинтересован в применении этих вычислений градиента только на примерах тестов, то есть я не хочу обновлять параметры модели - как это сделать?
Я пытался (безуспешно) две вещи до сих пор:
Использование tf.py_func, чтобы обернуть мою простую версию Numpy из более РЕЛУ, который затем имеет право пересмотреть это градиент операции через г .gradient_override_map менеджер контекста.
Соберите значения обратного хода и обратные значения BackProp и примените пороговое значение для тех, которые связаны с Relus.
Я потерпел неудачу с обоими подходами, потому что они требуют некоторых знаний о внутренних функциях TF, которые в настоящее время у меня нет.
Может ли кто-нибудь предложить любой другой маршрут или набросать код?
Большое спасибо.
Привет, Kaveman, спасибо за быстрый ответ. В последнем вызове tf.gradients вы намеренно передаете Dafter_relu в качестве первого аргумента? – Peter
Кроме того, я все еще смущен. как обобщить это в сети со многими слоями таким образом, который работает для любого NN, который имеет элементы RELU. Для этой части вам не нужно будет отслеживать все входные/выходные данные каждого элемента RELU и «цепочку» вашей ранее описанной логики? Благодарю. – Peter
@Peter, извините, это была опечатка. Второй вызов 'tf.gradients' -' after_relu' w.r.t. 'Params'. – keveman