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

时间:2019-06-12 22:00:23

标签: python tensorflow tensorflow2.0

我正在尝试在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))

    [ ... ]

这时,我得到一个错误:

  

ValueError:没有为任何变量提供渐变...

我知道问题出在哪里:致电tape.gradient()时出了点问题。如果我检查对象gradient,这就是我得到的:

print(gradients)
  

[无,无,无,无,无,无,无,无,无,无,无,   无,无,无,无,无,无,无,无,无,无,无]

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

-

PS:这个问题不同于this one,后者基于TF 1.x。

1 个答案:

答案 0 :(得分:0)

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