【发布时间】:2019-11-30 08:16:36
【问题描述】:
在训练我的网络时,我偶尔会遇到以下警告:
W0722 11:47:35.101842 140641577297728 optimizer_v2.py:928] Gradients does not exist for variables ['model/conv1d_x/Variable:0'] when minimizing the loss.
这种情况很少发生(可能每 20 步成功执行一次)。我的模型基本上有两条路径,它们在网络中的不同位置连接在一起。为了说明这一点,这里有一个简化的例子来说明我的意思。
class myModel(tf.keras.Model):
def __init__(self):
self.conv1 = Conv2D(32)
self.conv2 = Conv2D(32)
self.conv3 = Conv2D(16)
def call(self, inputs):
net1 = self.conv1(inputs)
net2 = self.conv2(inputs)
net = tf.concat([net1, net2], axis=2)
net = self.conv3(net)
end_points = tf.nn.softmax(net)
model = myModel()
with tf.GradientTape() as tape:
predicition = model(image)
loss = myloss(labels, prediction)
gradients = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
实际上,我的网络要大得多,但通常没有梯度的变量往往是网络顶部的变量。在每个Conv2D 层之前,我还有一个自定义渐变。有时当我出现错误时,我会注意到尚未调用该图层的渐变函数。
我的问题是,当通过我的网络向后传播时,渐变胶带有时如何采用看似不同的路径。我的第二个问题是,这是由于通过我的网络有两条单独的路由(即 conv1 和 conv2)造成的。这种网络架构是否存在根本缺陷?
理想情况下,我可以向GradientTape() 定义它必须找到每个顶层的渐变吗?
【问题讨论】:
-
您好 D.Griffiths,根据您指定的代码和您给出的解释,我们无法重现您的错误。您能否分享完整的代码(代表您的架构和自定义渐变的虚拟代码就足够了),以便我们可以尝试重现错误并努力解决它。谢谢。
-
嗨,重现问题的代码将是我的整个网络,它相当大,包含自定义操作和特定数据等。我不认为这是 TF 代码的错误。对于某些变量间歇性地导致错误抛出的梯度不存在的情况,我更加徘徊。例如,可能发生被零除是否正常,或者这是我应该担心的事情(甚至是我的错误)。
-
它还在发生吗?
-
我刚刚遇到了一个类似的问题,我总是收到警告。我的代码不同。基本上,在自定义类的构建函数中,我添加了一个权重并覆盖了我对它的引用。通过避免警告消失了。但你的情况似乎并不相似。
标签: python tensorflow keras