在tensorflow2.2中使用Keras自定义模型的指标度量

本文涉及的产品
交互式建模 PAI-DSW,5000CU*H 3个月
简介: 在tensorflow2.2中使用Keras自定义模型的指标度量

使用Keras和tensorflow2.2可以无缝地为深度神经网络训练添加复杂的指标

Keras对基于DNN的机器学习进行了大量简化,并不断改进。这里,我们将展示如何基于混淆矩阵(召回、精度和f1)实现度量,并展示如何在tensorflow 2.2中非常简单地使用它们。

当考虑一个多类问题时,人们常说,如果类是不平衡的,那么准确性就不是一个好的度量标准。虽然这是肯定的,但是当所有的类训练的不完全拟合时,即使数据集是平衡的,准确性也是一个糟糕的度量标准。

在本文中,我将使用Fashion MNIST来进行说明。然而,这并不是本文的唯一目标,因为这可以通过在训练结束时简单地在验证集上绘制混淆矩阵来实现。我们在这里讨论的是轻松扩展keras.metrics的能力。用来在训练期间跟踪混淆矩阵的度量,可以用来跟踪类的特定召回、精度和f1,并使用keras按照通常的方式绘制它们。

在训练中获得班级特定的召回、精度和f1至少对两件事有用:

我们可以看到训练是否稳定,每个类的损失在图表中显示的时候没有跳跃太多

我们可以使用一些技巧-早期停止甚至动态改变类权值。

自tensorflow 2.2以来,添加了新的模型方法train_step和test_step,将这些定制度量集成到训练和验证中变得非常容易。还有一个关联predict_step,我们在这里没有使用它,但它的工作原理是一样的。

我们首先创建一个自定义度量类。虽然还有更多的步骤,它们在参考的jupyter笔记本中有所体现,但重要的是实现API并与Keras 训练和测试工作流程的其余部分集成在一起。这就像实现和update_state一样简单,update_state接受真实的标签和预测,reset_states重新初始化度量。

 class ConfusionMatrixMetric(tf.keras.metrics.Metric):
    def update_state(self, y_true, y_pred,sample_weight=None):
        self.total_cm.assign_add(self.confusion_matrix(y_true,y_pred))
        return self.total_cm
    def result(self):
        return self.process_confusion_matrix()
    def confusion_matrix(self,y_true, y_pred):
        """
        Make a confusion matrix
        """
        y_pred=tf.argmax(y_pred,1)
        cm=tf.math.confusion_matrix(y_true,y_pred,dtype=tf.float32,num_classes=self.num_classes)
        return cm
    def process_confusion_matrix(self):
        "returns precision, recall and f1 along with overall accuracy"
        cm=self.total_cm
        diag_part=tf.linalg.diag_part(cm)
        precision=diag_part/(tf.reduce_sum(cm,0)+tf.constant(1e-15))
        recall=diag_part/(tf.reduce_sum(cm,1)+tf.constant(1e-15))
        f1=2*precision*recall/(precision+recall+tf.constant(1e-15))
        return precision,recall,f1

在正常的Keras工作流中,方法结果将被调用,它将返回一个数字,不需要做任何其他事情。然而,在我们的例子中,我们返回了三个张量:precision、recall和f1,而Keras不知道如何开箱操作。

由于tensorflow 2.2,可以透明地修改每个训练步骤中的工作(例如,在一个小批量中进行的训练),而以前必须编写一个在自定义训练循环中调用的无限函数,并且必须注意用tf.功能启用自动签名。

 class MySequential(keras.Sequential):
    def train_step(self, data):
        # Unpack the data. Its structure depends on your model and
        # on what you pass to `fit()`.       x, y = data       with tf.GradientTape() as tape:
            y_pred = self(x, training=True) # Forward pass
            # Compute the loss value.
            # The loss function is configured in `compile()`.
            loss = self.compiled_loss(
                y,
                y_pred,
                regularization_losses=self.losses,
            )       # Compute gradients
        trainable_vars = self.trainable_variables
        gradients = tape.gradient(loss, trainable_vars)       # Update weights
        self.optimizer.apply_gradients(zip(gradients, trainable_vars))
        self.compiled_metrics.update_state(y, y_pred)
        output={m.name: m.result() for m in self.metrics[:-1]}
        if 'confusion_matrix_metric' in self.metrics_names:
            self.metrics[-1].fill_output(output)
        return output

现在可以创建(使用上面的类而不是keras.Sequential)、编译并训练一个顺序模型(处理函数和子类化API的过程非常简单,只需实现上面的函数)。生成的历史记录现在有了val_F1_1等元素。

这样做的好处是,我们可以看到各个批次是如何训练的

640.png

我们看到class 6的训练非常糟糕,验证集的F1值为。6左右,但是训练本身是稳定的(情节没有太多跳跃)。

最后,让我们看看混淆矩阵,看看类6发生了什么

640.png

在混淆矩阵中,真实类在y轴上,预测类在x轴上。我们看到,shirt(6),被错误标记为t-shirt(0),pullovers(2)和coats (4)。相反,错误标记为shirts的情况主要发生在t-shirts上。

这种类型的错误是合理的,我将在另一篇文章中讨论在这种情况下如何改进培训。

最后做一个总结:我们只用了一些简单的代码就使用Keras无缝地为深度神经网络训练添加复杂的指标,通过这些代码能够帮助我们在训练的时候更高效的工作。以下是本文的代码:

https://github.com/borundev/ml_cookbook/blob/master/Custom%20Metric%20(Confusion%20Matrix)%20and%20train_step%20method.ipynb

目录
相关文章
|
5天前
|
机器学习/深度学习 TensorFlow 算法框架/工具
关于Tensorflow!目标检测预训练模型的迁移学习
这篇文章主要介绍了使用Tensorflow进行目标检测的迁移学习过程。关于使用Tensorflow进行目标检测模型训练的实战教程,涵盖了从数据准备到模型应用的全过程,特别适合对此领域感兴趣的开发者参考。
19 3
关于Tensorflow!目标检测预训练模型的迁移学习
|
5天前
|
机器学习/深度学习 TensorFlow API
Python深度学习基于Tensorflow(3)Tensorflow 构建模型
Python深度学习基于Tensorflow(3)Tensorflow 构建模型
71 2
|
5天前
|
机器学习/深度学习 数据可视化 TensorFlow
【Python 机器学习专栏】使用 TensorFlow 构建深度学习模型
【4月更文挑战第30天】本文介绍了如何使用 TensorFlow 构建深度学习模型。TensorFlow 是谷歌的开源深度学习框架,具备强大计算能力和灵活编程接口。构建模型涉及数据准备、模型定义、选择损失函数和优化器、训练、评估及模型保存部署。文中以全连接神经网络为例,展示了从数据预处理到模型训练和评估的完整流程。此外,还提到了 TensorFlow 的自动微分、模型可视化和分布式训练等高级特性。通过本文,读者可掌握 TensorFlow 基本用法,为构建高效深度学习模型打下基础。
|
5天前
|
机器学习/深度学习 算法 TensorFlow
TensorFlow 2keras开发深度学习模型实例:多层感知器(MLP),卷积神经网络(CNN)和递归神经网络(RNN)
TensorFlow 2keras开发深度学习模型实例:多层感知器(MLP),卷积神经网络(CNN)和递归神经网络(RNN)
|
5天前
|
机器学习/深度学习 PyTorch TensorFlow
TensorFlow、Keras 和 Python 构建神经网络分析鸢尾花iris数据集|代码数据分享
TensorFlow、Keras 和 Python 构建神经网络分析鸢尾花iris数据集|代码数据分享
|
5天前
|
机器学习/深度学习 TensorFlow API
Python安装TensorFlow 2、tf.keras和深度学习模型的定义
Python安装TensorFlow 2、tf.keras和深度学习模型的定义
|
5天前
|
机器学习/深度学习 大数据 TensorFlow
使用TensorFlow实现Python简版神经网络模型
使用TensorFlow实现Python简版神经网络模型
|
5天前
|
机器学习/深度学习 TensorFlow 算法框架/工具
TensorFlow的保存与加载模型
【4月更文挑战第17天】本文介绍了TensorFlow中模型的保存与加载。保存模型能节省训练时间,便于部署和复用。在TensorFlow中,可使用`save_model_to_hdf5`保存模型结构,`save_weights`保存权重,或转换为SavedModel格式。加载时,通过`load_model`恢复结构,`load_weights`加载权重。注意模型结构一致性、环境依赖及自定义层的兼容性问题。正确保存和加载能有效利用模型资源,提升效率和准确性。
|
5天前
|
机器学习/深度学习 数据采集 TensorFlow
TensorFlow与迁移学习:利用预训练模型
【4月更文挑战第17天】本文介绍了如何在TensorFlow中运用迁移学习,特别是利用预训练模型提升深度学习任务的性能和效率。迁移学习通过将源任务学到的知识应用于目标任务,减少数据需求、加速收敛并提高泛化能力。TensorFlow Hub提供预训练模型接口,可加载模型进行特征提取或微调。通过示例代码展示了如何加载InceptionV3模型、创建特征提取模型以及进行微调。在实践中,注意源任务与目标任务的相关性、数据预处理和模型调整。迁移学习是提升模型性能的有效方法,TensorFlow的工具使其变得更加便捷。
|
5天前
|
机器学习/深度学习 监控 测试技术
TensorFlow的模型评估与验证
【4月更文挑战第17天】TensorFlow是深度学习中用于模型评估与验证的重要框架,提供多样工具支持这一过程。模型评估衡量模型在未知数据上的表现,帮助识别性能和优化方向。在TensorFlow中,使用验证集和测试集评估模型,选择如准确率、召回率等指标,并通过`tf.keras.metrics`模块更新和获取评估结果。模型验证则确保模型稳定性和泛化能力,常用方法包括交叉验证和留出验证。通过这些方法,开发者能有效提升模型质量和性能。