Python 在tensorflow.data.Dataset.map()函数中执行的操作的渐变
我有一个包含X和Y部分的数据集。在输入到神经网络之前,需要将X转换成D 我使用Python 在tensorflow.data.Dataset.map()函数中执行的操作的渐变,python,tensorflow,neural-network,tensorflow-datasets,Python,Tensorflow,Neural Network,Tensorflow Datasets,我有一个包含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
类来执行此操作:
# 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
是一个tensorflow函数,它将X
和Y
张量作为输入,并返回D
和Y
张量
D
然后被分批分割并用作神经网络的输入。神经网络的输出是Y\u预测
我需要获得关于X
的Y\u预测的梯度。但是,在尝试时:
gradients = tf.gradients(Y_prediction, X)
出现以下错误:
LookupError:gradient注册表没有以下项:IteratorGetNext
LookupError:没有为操作“IteratorGetNext_1”(操作1)定义梯度
类型:IteratorGetNext)
问题:
似乎很容易获得关于D
的Y\u预测的梯度。但是,我如何计算相对于X
的Y_预测的梯度呢
注:
X_to_D
函数的内存非常紧张,只能在非常小的数据批上执行。因此,我无法创建数据集,将其分批拆分,并在每个批次用于培训之前,将其从X
转换为D
。这是因为用于培训的批量太大,无法进行X
到D
转换 使用tensorflow 2.0,您可以编写自定义模型,这允许您计算输入的导数w.r.t。比如说,
class MyModel(tf.keras.Model):
def __init__(self):
super(MyModel,self).__init__(name = 'my_model')
self.dense_1 = layers.Dense(32,activation = 'relu', input_dim=2)
self.dense_2 = layers.Dense(64,activation=tf.sin)
self.dense_3 = layers.Dense(1)
def call(self, inputs):
# Define your forward pass here
x = self.dense_1(inputs)
x = self.dense_2(x)
return self.dense_3(x)
model = MyModel()
optimizer = tf.keras.optimizers.RMSprop(0.001)
model.compile(loss='mse',
optimizer=optimizer,
metrics=['mae', 'mse'])
history = model.fit(X_train, y_train, epochs=10, batch_size = 1,
validation_split = 0.2, verbose=0)
要计算导数,请执行以下操作:
x = tf.constant(X_train[:1,:])
with tf.GradientTape() as g:
g.watch(x)
y = model.call(x)
dy_dx = g.gradient(y, x)
print(y)
dy_dx
您不计算有关X
(网络输入)的渐变。您可以根据模型中的变量(神经网络权重、偏差等)计算梯度。@xdurch0我想要相对于占位符X的梯度。通常这会起作用(参见示例),但由于tf.data.Iterator,这似乎不起作用。我正在寻找一种方法来解决这个问题。