TensorFlow 2.0: tf.GradientTape() 返回 None 结果



我正在尝试在TensorFlow 2.0中训练CNN模型。这是一项多类分类任务。我正在简化代码以使其更具可读性:

# Loss function
loss = tf.keras.metrics.CategoricalCrossentropy()
# Optimizer
optimizer = tf.optimizers.Adam(learning_rate = 0.0005)

# Training:
for epoch in range(1000):
    # fetch mini batch of data
    X_batch, y_batch = fetch_batch( [...] )
    with tf.GradientTape() as tape:
        current_loss = loss(y_batch, CNN(X_batch))  # take current loss
    # get the gradient of the loss function
    gradients = tape.gradient(current_loss, CNN.trainable_variables)
    # update weights
    optimizer.apply_gradients(zip(gradients, CNN.trainable_variables))
    [ ... ]

此时,我收到一个错误:

值错误:没有为任何变量提供梯度...

我知道问题出在哪里:当我打电话给tape.gradient()时出现问题。如果我检查对象gradient这就是我得到的:

print(gradients)
[无、无、无、无、

无、

无、无、无、无、无、无]

我不明白为什么gradients像这样返回。我已经从字面上复制粘贴了用于在TF 2.0中训练其他(非CNN(模型的代码,并且它们总是运行良好。我的模型的所有其他元素似乎都表现得像它们应该的那样。

--

PS:这个问题与这个问题不同,这个问题是基于TF 1.x的。

我认为您希望tf.keras.losses.CategoricalCrossentropy作为您的损失,而不是metrics版本。这些实际上是不同的函数,而不是别名。

相关内容

  • 没有找到相关文章

最新更新