我正在尝试在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。
答案 0 :(得分:0)
我认为您希望tf.keras.losses.CategoricalCrossentropy
作为损失,而不是metrics
版本。这些实际上是不同的功能,而不是别名。