在训练我的网络时,我偶尔会遇到警告:
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()
它必须找到每个顶层的梯度?
Nguyễn 和 gkennos 给出的解决方案将抑制错误,因为它将替换所有None
由零。
然而,一个大问题是你的梯度在任何时间点都为空。
上述问题肯定是由unconnected variables
(默认情况下 PyTorch 会抛出运行时错误)。
最常见的不连接层的情况可以举例如下:
def some_func(x):
x1 = x * some variables
x2 = x1 + some variables #x2 discontinued after here
x3 = x1 / some variables
return x3
现在观察一下x2
未连接,因此梯度不会被传播。仔细调试代码中未连接的变量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)