У меня есть набор данных, который включает в себя 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
.