Во-первых: Я всего несколько дней в Tensorflow, поэтому, пожалуйста, несите меня.Как определить только градиент для подграфа Tensorflow?
Я начал с кода учебника cifar10, и теперь я использую комбинацию сверток и разложения по собственным значениям, которые нарушают символическое дифференцирование. То есть график строится, затем при вызове train()
сценарий останавливается с «Без градиента, определенного для операции [...] (тип операции: SelfAdjointEig)». Не удивительно.
Входы на рассматриваемый подграф все еще являются только картами входных функций и используемыми фильтрами, и у меня есть формулы для градиентов под рукой, и они должны быть прямолинейными для реализации с учетом входных данных для подграфа и градиент по отношению к его выходу.
Из того, что я вижу в документах, я могу зарегистрировать метод градиента для пользовательских операций с RegisterGradient
или переопределить их с помощью экспериментального gradient_override_map
. Обе из них должны дать мне доступ к тем вещам, которые мне нужны. Например, searching on Github Я нахожу множество примеров, которые обращаются к входам op как op.input[0]
или тому подобное.
Проблема у меня в том, что я хочу по существу «сократить» целый подграф, а не один операнд, поэтому у меня нет единого ор, чтобы украсить. Так как это происходит в одном из сверточных слоев примера cifar, я попытался использовать объект области видимости для этого слоя. Концептуально, что входит и выходит, что граф области видимости - это именно то, что я хочу, если бы я мог каким-то образом переопределить градиенты всей области, которые «уже» это сделают.
Я видел tf.Graph.create_op
, который (я думаю) мог бы использовать для регистрации нового типа операции, и тогда я мог бы переопределить вычисление градиента типа операции с вышеупомянутыми методами. Но я не вижу способа определить, что op пересылает, не записывая его в C++ ...
Может быть, я совсем не подхожу к этому? Так как все мои операции вперед или назад могут быть реализованы с помощью интерфейса python, я, очевидно, хочу избежать реализации чего-либо на C++.
Может быть, вы можете изменить градиент для одного цита на верхней части undifferentiable графа, а затем использовать 'tf.stop_gradient()', чтобы не допустить строительство градиента для этого подграфа? http://stackoverflow.com/questions/33727935/how-to-use-stop-gradient-in-tensorflow –
Я могу представить локально определение градиентной функции, а затем использовать в ней все еще входящие в нее входы. Но как бы сказать, какие градиенты узлов я беру в качестве вклада в вычисление градиента? Мне кажется, что я принципиально неправильно использую структуру: P –