【发布时间】:2021-04-01 09:15:55
【问题描述】:
像下面的代码一样连接了 3 个神经网络,我们如何从初始网络中获取两个梯度?第一个梯度工作,但第二个返回 None 张量。似乎它们彼此没有关联以获得渐变。这里有什么问题??
with tf.GradientTape() as tape1:
with tf.GradientTape() as tape2:
output1 = NN_model1(input1, training=True)
output2 = NN_model2(output1, training=True)
output3 = NN_model3([input1, output1, output2], training=True)
loss1 = -tf.math.reduce_mean(output3)
loss2 = -tf.math.reduce_mean(output2)
grad1 = tape2.gradient(loss1, NN_model1.trainable_variables)
grad2 = tape1.gradient(loss2, grad1)
optimizer.apply_gradients(zip(grad2, NN_model1.trainable_variables))
【问题讨论】:
-
这个
tape1.gradient(loss2, grad1)有什么意义? -
这就像第一个 NN 选择要执行的动作,第二个选择该动作的参数(以 0.5 的功率射门或以 0.25 的功率传球)最后一个 NN 是 Q 值。因此,对于一种输入状态和一种输出,我们可能有多个 Q 值,优化将无法正常工作。因此我们也需要为第二个 NN 输出做一个梯度。
标签: python tensorflow keras neural-network gradient