在TensorFlow v.2中使用GradientTape()计算雅可比矩阵

我目前正在尝试在训练循环中使用GradientTape()batch_jacobian计算雅可比矩阵,但在TensorFlow 2中我只能得到None值…

我当前的尝试如下所示:

for step, (batch_x, batch_y) in enumerate(train_data):            with tf.GradientTape(persistent=True) as g:                g.watch(batch_x)                g.watch(batch_y)                logits = self.retrained(batch_x, is_training=True)                loss = lstm.cross_entropy_loss(logits, batch_y)                acc = lstm.accuracy(logits, batch_y)            avg_loss += loss            avg_acc += acc            gradients = g.gradient(loss, self.retrained.trainable_variables)            J = g.batch_jacobian(logits, batch_x, experimental_use_pfor=False)            print(J.numpy())            self.optimizer.apply_gradients(zip(gradients, self.retrained.trainable_variables))

回答:

以下代码使用的是TensorFlow 2:

在这里,我创建了一个简单的神经网络,然后对其输入进行偏导数计算:

model = tf.keras.Sequential([tf.keras.layers.Flatten(input_shape=(2,1)),tf.keras.layers.Dense(3),tf.keras.layers.Dense(2)])

现在我使用GradientTape来计算雅可比矩阵(对于输入:x=2.0,y=3.0):

x = tf.Variable([[2.0]])y = tf.Variable([[3.0]])with tf.GradientTape(persistent=True) as t:    t.watch([x,y])    z = tf.concat([x,y],1)    f1 = model(z)[0][0]    f2 = model(z)[0][1]df1_dx = t.gradient(f1, x).numpy()df1_dy = t.gradient(f1, y).numpy()df2_dx = t.gradient(f2, x).numpy()df2_dy = t.gradient(f2, y).numpy()del tprint(df1_dx,df1_dy)print(df2_dx,df2_dy)

请注意,由于神经网络的权重是随机初始化的,雅可比矩阵或打印输出的结果如下:

[[-0.832729]] [[-0.19699946]][[-0.5562407]] [[0.53551793]]

我已经尝试更详细地解释如何计算一个显式函数和一个神经网络的雅可比矩阵,详见这里

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注