Во-первых: я всего несколько дней в Tensorflow, поэтому, пожалуйста, несите меня.
Я начал с кода cifar10 tutorial, и теперь я использую комбинацию сверток и разложения по собственным значениям, которые нарушают символическое дифференцирование. То есть график создается, а затем при вызове train()
останавливается script с "Без градиента, определенного для операции [...] (тип op: SelfAdjointEig)". Не удивительно.
Входы на рассматриваемый подграф все еще являются только картами входных функций и используемыми фильтрами, и у меня есть формулы для градиентов под рукой, и они должны быть прямолинейными для реализации с учетом входных данных для подграфа и градиент относительно его выхода.
Из того, что я вижу в документах, я могу зарегистрировать метод градиента для пользовательских Ops с RegisterGradient
или переопределить их с помощью экспериментального gradient_override_map
.
Оба из них должны дать мне доступ к тем вещам, которые мне нужны. Например, поиск в Github. Я нахожу много примеров, которые обращаются к операционным входам как op.input[0]
или к такому.
Проблема заключается в том, что я хочу по существу "сократить" целый подграф, а не один операнд, поэтому у меня нет единого ор, чтобы украсить. Поскольку это происходит в одном из сверточных слоев примера cifar, я попытался использовать объект области видимости для этого слоя. Концептуально то, что входит и выходит из этого графика области, является именно тем, что я хочу, если бы я мог каким-то образом переопределить все градиенты области, которые "уже" это сделают.
Я видел tf.Graph.create_op
, который (я думаю) мог бы использовать для регистрации нового типа операции, и я мог бы затем переопределить это вычисление градиента типа операции с вышеупомянутыми методами, Но я не вижу способа определить этот проход вперед, не записывая его в С++...
Может быть, я полностью подхожу к этому? Поскольку все мои операции вперед или назад могут быть реализованы с помощью интерфейса python, я, очевидно, хочу избежать реализации чего-либо на С++.