下面的代码是否给出了Keras中多类分类的调用?尽管我在调用model.compile中的recall函数时没有传递y_true和y_pred,但它向我显示了recall的结果。
def recall(y_true, y_pred):
y_true = K.ones_like(y_true)
true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
all_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
recall = true_positives / (all_positives + K.epsilon())
return recall
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=[recall])
是的,它之所以有效,是因为在指定这些值的model.fit()
内部会多次调用recall。
它的工作方式与此类似(更复杂和优化(:
accuracy = tf.keras.metrics.CategoricalAccuracy()
loss_fn = tf.keras.losses.CategoricalCrossentropy(from_logits=True)
optimizer = tf.keras.optimizers.Adam()
# Iterate over the batches of a dataset.
for step, (x, y) in enumerate(dataset):
with tf.GradientTape() as tape:
logits = model(x)
# Compute the loss value for this batch.
loss_value = loss_fn(y, logits)
# Update the state of the `accuracy` metric.
accuracy.update_state(y, logits)
# Update the weights of the model to minimize the loss value.
gradients = tape.gradient(loss_value, model.trainable_weights)
optimizer.apply_gradients(zip(gradients, model.trainable_weights))
# Logging the current accuracy value so far.
if step % 100 == 0:
print('Step:', step)
print('Total running accuracy so far: %.3f' % accuracy.result())
这被称为梯度胶带,它可以用来执行定制的列车循环。基本上,它暴露了在模型的可训练张量上计算的梯度。它允许您手动更新模型的权重,因此它对个性化非常有用。所有这些工作也是在model.fit()
内部自动完成的。你不需要这个,它只是解释事情是如何运作的。
正如您所看到的,在数据集的每一批中都会计算预测,即logits
。logits
和基本事实,即正确的y
值,被作为accuracy.update_state
的自变量给出,就像在model.fit()
中看不到它一样。即使顺序相同,y_true
和y
都是基本事实,y_pred
和logits
是预测。
我希望这能让事情变得更清楚。