TensorFlow自定义训练步骤使用不同的损失函数

背景

根据TensorFlow文档,可以使用以下方式执行自定义训练步骤

# 用于测试的伪样本数据x_batch_train = tf.zeros([32, 3, 1], dtype="float32")y_batch_train = tf.zeros([32], dtype="float32")
loss_fn = keras.losses.SparseCategoricalCrossentropy(from_logits=True)with tf.GradientTape() as tape:    logits = model(x_batch_train, training=True)    loss_value = loss_fn(y_batch_train, logits)grads = tape.gradient(loss_value, model.trainable_weights)optimizer.apply_gradients(zip(grads, model.trainable_weights))

但如果我想使用不同的损失函数,比如类别交叉熵,我需要在梯度带中对生成的logits进行argmax操作:

loss_fn = tf.keras.lossees.get("categorical_crossentropy")with tf.GradientTape() as tape:    logits = model(x_batch_train, training=True)    prediction = tf.cast(tf.argmax(logits, axis=-1), y_batch_train.dtype)    loss_value = loss_fn(y_batch_train, prediction)grads = tape.gradient(loss_value, model.trainable_weights)optimizer.apply_gradients(zip(grads, model.trainable_weights))

问题

这样做的问题在于tf.argmax函数不可微分,因此TensorFlow无法计算梯度,你会得到以下错误:

ValueError: No gradients provided for any variable: [...]

我的问题: 在不更改损失函数的情况下,如何使第二个示例工作?


回答:

categorical_crossentropy期望你的标签是一热编码的,所以你首先需要确保这一点。然后直接传递模型的结果,输出应该是每个类别的概率,更多信息 -> https://www.tensorflow.org/api_docs/python/tf/keras/losses/CategoricalCrossentropy#standalone_usage

Related Posts

如何在Python中使用训练好的模型测试新句子 (sklearn)

我有用于多类文本分类的训练模型代码,并且它运行正常,但…

提取图像数据集的样本

已关闭。此问题需要详细信息或澄清。目前不接受回答。 想…

尝试使用TFjs和React Native进行实时对象检测,总是给出相同的预测结果,并且在打开摄像头时停止

当摄像头打开时,会出现一个空白的摄像头画面几秒钟,然后…

如何在TensorFlow中监控准确率(度量准确率不可用)

我想监控我的TensorFlow模型的准确率,但在使用…

使用`GridSearchCV`测试完全删除管道中一个步骤的效果?[重复]

这个问题已经有答案了: 是否可以切换scikit-le…

如何获得正确的权重?

我正在处理一个NLP数据集。 我有一个数据集,想要训练…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注