Градиенты операций, выполняемых в функции tenorflow.data.Dataset.map () - PullRequest
0 голосов
/ 10 июня 2018

У меня есть набор данных, который включает в себя X и Y часть.X необходимо превратить в D, прежде чем вводить в нейронную сеть.

Для этого я использую класс tf.data.Dataset:

# Making the place holders
X = tf.placeholder(shape=[n_samples, n_atoms, 3], dtype=tf.float32)
Y = tf.placeholder(shape=[n_samples, 1], dtype=tf.float32)

# Creating the data set
dataset = tf.data.Dataset.from_tensor_slices((X, Y))

# Transforming X to D using the map function 
dataset = dataset.map(X_to_D)
dataset = dataset.batch(200)
iterator = tf.data.Iterator.from_structure(dataset.output_types, dataset.output_shapes)
batch_D, batch_Y = iterator.get_next()

Где функция X_to_D - функция тензорного потока, которая принимает тензоры X и Y в качестве входных данныхи возвращает тензоры D и Y.

D затем разделяется на партии и используется в качестве входных данных для нейронной сети.Выход нейронной сети составляет Y_prediction.

Мне нужно получить градиенты Y_prediction относительно X.Однако при попытке:

gradients = tf.gradients(Y_prediction, X)

возникает ошибка:

LookupError: в градиенте реестра нет записи для: IteratorGetNext LookupError: Градиент не определен для операции 'IteratorGetNext_1' (тип операции: IteratorGetNext)

Вопрос: Кажется, что легко получить градиенты Y_prediction относительно D.Но как мне поступить с вычислением градиентов Y_prediction относительно X?

Примечание: функция X_to_D очень интенсивно использует память и может быть выполнена только на действительно небольших пакетах данных,Поэтому я не могу создать набор данных, разбить его на партии и выполнить преобразование с X до D непосредственно перед тем, как каждая партия будет использована для обучения.Это связано с тем, что размер пакета, используемого для обучения, был бы слишком велик для преобразования X в D.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...