Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在tensorflow.data.Dataset.map()函数中执行的操作的渐变_Python_Tensorflow_Neural Network_Tensorflow Datasets - Fatal编程技术网

Python 在tensorflow.data.Dataset.map()函数中执行的操作的渐变

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

我有一个包含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
是一个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,这似乎不起作用。我正在寻找一种方法来解决这个问题。