Поддерживает ли API C ++ тензорного потока автоматическое дифференцирование для обратного распространения градиента?
Если я напишу граф на c ++ и захочу запустить его в коде c ++ (не в python!), Будет ли работать автоматическое дифференцирование?
Давайте предположим, что каждая операция в графе имеет реализацию градиента.
Я думаю, что документация относительно того, что может и не может сделать API C ++ тензорного потока, очень скудна.
Огромное спасибо за помощь
технически может, но AFAIK автоматическое разграничение только «настроено» в Python. Под этим я подразумеваю, что на более низком уровне каждая операция TensorFlow выполняет не объявите себе, каков его градиент (то есть соответствующая операция, которая вычисляет его градиент). Это вместо этого объявлено на уровне Python. Например, вы можете взглянуть на math_ops.py
. Вы увидите, что, помимо прочего, есть несколько функций, украшенных @ops.RegisterGradient(...)
, Этот декоратор добавляет эту функцию в глобальный реестр (в Python) операций и их градиентов. Так, например, классы оптимизатора в значительной степени реализованы в Python, поскольку они используют этот реестр для построения вычислений обратного распространения (в отличие от использования для этой цели собственных примитивов TensorFlow, которые не существуют).
Итак, дело в том, что вы можете делать те же вычисления, используя те же операции (которые затем реализуются с теми же ядрами), но я не думаю, что C ++ имеет (или когда-либо будет) такой градиентный реестр (и классы оптимизатора), поэтому вам нужно будет самостоятельно разработать или скопировать эту конструкцию обратного распространения. В целом, C ++ API не очень подходит для построения графа вычислений.
Теперь другой вопрос (и, возможно, именно об этом вы и спрашивали в первую очередь) — можете ли вы запустить уже существующий граф, который выполняет обратное распространение в C ++. Под этим я подразумеваю создание графа вычислений в Python, создание оптимизатора (который, в свою очередь, создает необходимые операции в графе для вычисления градиента и обновления переменных) и экспорта графа, а затем загрузки этого графа в C ++ и его запуска. Это вполне возможно и ничем не отличается от запуска чего-либо другого в TensorFlow C ++.
Других решений пока нет …