Как разделить сеть Tensorflow на две части с поддержанием обратного распространения градиента?

#neural-network #tensorflow #autoencoder

#нейронная сеть #tensorflow #автоэнкодер

Вопрос:

Я пытаюсь реализовать «Глубокую сверточную обратную графическую сеть» с помощью tensorflow, и это означает, что мне приходится делать сложные вещи с градиентом.

В принципе, я хочу разделить автоэнкодер на две независимые сети. Мне не обязательно, но это было бы удобно. Цель состоит в том, чтобы применить некоторые неописуемые модификации к градиенту, текущему на этапе обратного распространения. У вас есть какие-либо идеи, как это можно сделать? Вот схема того, чего я хочу достичь: введите описание изображения здесь

Легко видеть, что для прямого пути это означает получение выходных данных одной сети и подключение их к другой. К сожалению, я не могу увидеть, как выполнить обратное распространение ошибки.

Моя лучшая идея на данный момент — дублировать одну из весовых матриц, т. Е. скопировать W3 в кодировщик как W2.5, а затем скопировать градиент W3 как градиент W2.5. Но в этой схеме должен быть более простой способ или очевидное недоразумение.

Комментарии:

1. Один из способов, которым вы могли бы это сделать, — встроить вашу среду, отличную от TF, в оператор Tensorflow. Затем Tensorflow может позаботиться о распространении активаций вперед и градиентов назад. tf.py_func это один из способов вызвать нетензорный поток из графика Tensorflow; другой способ — определить пользовательский оператор C . Можно определить пользовательские функции градиента для операторов (см. github.com/tensorflow/tensorflow/issues/1095 о том, как это сделать с помощью tf.py_func); ваш пользовательский градиент может творить любые невыразимые ужасы, какие вам нравятся.