首页 > 编程语言 >Python贝叶斯卷积神经网络BCNN分类胸部X光图像数据集实例

Python贝叶斯卷积神经网络BCNN分类胸部X光图像数据集实例

时间:2024-09-06 17:19:17浏览次数:10  
标签:X光 Python BCNN 分类 贝叶斯 tf 类别 数据 fn

全文链接:https://tecdat.cn/?p=37604

原文出处:拓端数据部落公众号

分析师:Yuanchun Niu

人工智能的诸多领域中,分类技术扮演着核心角色,其应用广泛而深远。无论是在金融风险评估、医疗诊断、安全监控还是日常的交互式服务中,有效的分类算法都是实现智能决策的关键。随着大数据时代的到来,分类算法面临着前所未有的挑战和机遇。一方面,海量的数据为算法提供了丰富的学习材料;另一方面,如何从这些数据中提取有价值的信息,构建准确、可靠的分类模型,成为了研究的热点。

本文旨在探讨分类技术在不同领域的应用,并深入分析其理论基础与实现方法。我们首先概述了分类问题的基本框架,包括常见的输入输出特性。随后,通过具体的应用实例的代码数据,展示了分类技术在手写字符识别数据等领域的实际应用。进一步地,本文详细讨论了分类方法的演进,从基于回归的简单分类到基于概率模型的复杂分类策略,再到现代的贝叶斯方法,揭示了分类技术的发展脉络。

特别地,本文重点研究了贝叶斯卷积神经网络(Bayesian CNN)在处理数据不确定性方面的优势。通过引入KL散度作为正则化项,贝叶斯CNN能够在模型训练过程中自然地考虑参数的不确定性,从而在面对数据的噪声和变化时,提供更加鲁棒的预测。本文通过在玩具数据集和真实世界的胸部X光图像数据集上的实验,验证了贝叶斯CNN的有效性,并探讨了其在实际应用中的潜力。

一、引言

在人工智能领域,分类是一项至关重要的任务,它在众多实际应用中发挥着关键作用。从金融领域的信用评分到医疗诊断,从手写字符识别到人脸识别,分类问题无处不在。本文将对不同领域的分类问题进行探讨,分析其输入输出特点,并深入研究分类的实现方法。

二、分类应用实例

  • 信用评分
    • 输入:收入、储蓄、职业、年龄、过往财务历史等信息。
    • 输出:接受或拒绝。
  • 医疗诊断
    • 输入:当前症状、年龄、性别、过往医疗历史等。
    • 输出:可能的疾病种类。
  • 手写字符识别
    • 输入:手写字符 “金”。
    • 输出:识别结果。
  • 人脸识别
    • 输入:面部图像。
    • 输出:对应的人物。

三、分类方法

  • 基于回归的分类
    • 以二分类为例,训练时将类别 1 表示为目标为 1,类别 2 表示为目标为 -1。测试时,接近 1 的归为类别 1,接近 -1 的归为类别 2。
  • 多分类问题
    • 以类别 1 目标为 1、类别 2 目标为 2、类别 3 目标为 3 等为例,说明多分类问题的复杂性。
  • 理想的分类替代方案
    • 函数(模型):若函数 g (x)>0,输出为类别 1;否则输出为类别 2。
    • 损失函数:L (f) 为训练数据中函数结果错误的次数。
    • 寻找最佳函数:例如感知机、支持向量机等。

四、从类别中获取概率

假设数据点是从高斯分布中采样得到,寻找背后的高斯分布以确定新数据点的概率。

五、最大似然估计

对于给定的 “水” 类型数据点 x1,x2,x3,...,x79,假设它们来自具有最大似然的高斯分布 (μ*,Σ*)。

  1. 高斯分布的概率密度函数用特定形式表示。
  2. 似然函数 L (μ,Σ) 为多个概率密度函数的乘积形式。
  3. 通过最大似然估计确定参数 μ*,Σ*=argmax (μ,Σ) L (μ,Σ),其中 μ* 有特定表达式。

六、分类应用

现在可以进行分类,例如对于 “水” 类型分类问题,有 f (μ1,Σ1)(x) 的表达式,其中 P (c1) 有特定值。类似地,对于另一类别有 f (μ2,Σ2)(x) 的表达式,其中 P (c2) 有特定值。如果 P (c1|x)>0.5,则 x 属于类别 1(水)。

贝叶斯卷积神经网络对数据的影响|附代码数据

在本研究中,我们探讨了KL权重在贝叶斯卷积神经网络(CNN)中对数据的影响。首先,我们使用标准化方法对数据进行预处理,以确保模型训练的有效性。

x = \text{Scaler}().\text{fit_transform}(x)

为了监控模型在每个训练周期后参数的不确定性,我们设计了一个回调函数PosteriorRecorder,用于记录后验标准差。

 
 
  1.   class PosteriorRecorder(tf.keras.callbacks.Callback):
  2.   def __init__(self, **kwargs):
  3.   super(PosteriorRecorder, self).__init__(**kwargs)
 

随后,我们对不同的KL权重进行了模型训练,并对结果进行了记录和分析。

 

最后,我们绘制了不同KL权重下后验标准差的图表,以直观展示其对模型性能的影响。

 
  1.   scaler = Scaler()
  2.   x = scaler.fit_transform(x)
 

 

贝叶斯卷积神经网络在胸部X光图像数据集上的应用|附代码数据

在研究的第二部分,我们将贝叶斯CNN应用于真实数据集,以验证其在实际问题中的有效性。我们首先导入了必要的库,并忽略了可能产生的警告信息。

 
 
  1.   import warnings
  2.   warnings.filterwarnings('ignore')
  3.    
  4.   import tensorflow as tf # 2.8.0
  5.   import tensorflow_probability as tfp # 0.16
 

接着,我们加载并预处理了胸部X光图像数据集,为模型训练做好准备。

 
 
  1.   data_path = 'data/chest_xray/'
  2.   train_ds = tf.keras.utils.image_dataset_from_directory(data_path)
 

为了更好地理解数据集,我们探索了数据集中的图像和标签,并检查了类别分布。

 

 

 

我们定义了一个函数get_classes来统计数据集中各类别的数量,并通过可视化手段展示了类别分布。

 
  1.   def get_classes(dataset: tf.data.Dataset) -> np.ndarray:
  2.   counts = []
  3.   for image, label in dataset:
  4.   counts.append(np.argmax(label, axis=-1))
  5.    
  6.   # 使用Seaborn库绘制类别分布图
  7.   sns.countplot(class_names_test, ax=ax[1])
  8.   ax[1].set_title('Test set')
  9.   fig.suptitle('Class distribution')
 

 

为了近似计算KL散度,我们定义了kl_approx函数,并将其应用于模型训练过程中。

 
 
  1.   def kl_approx(q, p, q_tensor):
  2.   return tf.reduce_mean(q.log_prob(q_tensor) - p.log_prob(q_tensor))
  3.    
  4.   divergence_fn = lambda q, p, q_tensor: kl_approx(q, p, q_tensor) / (len(train_classes))
 

我们封装了重参数化层的创建过程,以简化模型构建的复杂性。

 
 
  1.   def get_convolution_reparameterization(filters, kernel_size, activation, strides=1, padding='SAME', prior=prior, divergence_fn=divergence_fn, name=None) -> tfpl.Convolution2DReparameterization:
  2.   """
  3.   返回一个Convolution2DReparameterization层。
  4.   """
  5.   return tfpl.Convolution2DReparameterization(
  6.   filters=filters,
  7.   kernel_size=kernel_size,
  8.   activation=activation,
  9.   strides=strides,
  10.   padding=padding,
  11.   kernel_posterior_fn=tfpl.default_mean_field_normal_fn(is_singular=False),
  12.   kernel_prior_fn=prior,
  13.   kernel_divergence_fn=divergence_fn,
  14.   bias_posterior_fn=tfpl.default_mean_field_normal_fn(is_singular=False),
  15.   bias_prior_fn=prior,
  16.   bias_divergence_fn=divergence_fn,
  17.   name=name)
 

通过构建残差块和特征提取器,我们构建了一个基于DenseNet121的贝叶斯ResNet模型,并对其进行了训练和评估。

 
 
  1.   feature_extractor = tf.keras.applications.DenseNet121(include_top=False, input_shape=(224, 224, 3), weights='imagenet')
  2.   feature_extractor.summary()
  3.    
  4.   # 构建贝叶斯ResNet模型
  5.   # ...
 

在模型训练过程中,我们使用了自定义的损失函数和评估指标,并应用了早停和学习率衰减等策略来优化训练效果。

 
 
  1.   model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), loss=nll, metrics=[tf.keras.metrics.CategoricalAccuracy()])
  2.    
  3.   callbacks = [
  4.   tf.keras.callbacks.EarlyStopping(monitor='val_categorical_accuracy', patience=7, restore_best_weights=True, verbose=1),
  5.   tf.keras.callbacks.ReduceLROnPlateau(monitor='val_categorical_accuracy', min_lr=1e-9, factor=0.1, patience=3, verbose=1)
  6.   ]
  7.    
  8.   model.fit(train_ds, epochs=64, validation_data=test_ds, callbacks=callbacks)
 

最后,我们对模型的预测结果进行了分析,以评估模型在真实数据上的性能。

 
  1.   def analyse_model_prediction(image, label=None, forward_passes=10):
  2.   # ...
  3.   # 分析模型预测
 

 

 

通过上述研究,我们展示了贝叶斯CNN在处理数据和真实数据时的有效性和灵活性。我们的研究为未来在更复杂的数据集上应用贝叶斯深度学习模型提供了有价值的参考。

关于分析师

在此对 Yuanchun Niu 对本文所作的贡献表示诚挚感谢,他完成了控制科学与工程专业的硕士研究生学位,专注深度学习、机器学习领域。擅长汇编语言、Python。

 

标签:X光,Python,BCNN,分类,贝叶斯,tf,类别,数据,fn
From: https://www.cnblogs.com/tecdat/p/18400628

相关文章

  • 【Python学习笔记】第3章 你应如何运行程序
    这一章主要讲:如何启动Python程序、如何交互地输入代码、代码的各种运行方式。交互式命令行模式开始一个交互式会话在终端中,输入python:我们就开启了会话。结束会话按Ctrl+Z:系统路径如果我们要在终端中,输入python就可以启动,那么就需要设置环境变量PATH使其包含安装的python......
  • 基于Python的机器学习系列(28):PyTorch中的张量基础
            在本篇中,我们将介绍PyTorch中的张量基础,包括如何将NumPy数组转换为PyTorch张量、创建张量、以及进行基本的张量操作。确认PyTorch版本        首先,确认您使用的PyTorch版本:importtorchprint(torch.__version__)将NumPy数组转换为PyTorch张量 ......
  • python画图|垂线标记系列
    进行了一段时间的直方图学习之后,发现python的matplo居然还支持画垂线标记图,赶紧把它记录下来。直方图绘制教程见下述链接:【a】直方图绘制基础教程:python画图|直方图绘制教程-CSDN博客【b】直方图绘制进阶教程:python画图|直方图绘制教程进阶-CSDN博客【c】堆叠直方图绘制......
  • 【python创建字符串数组的几种方式】
    在Python中可以使用以下几种方式创建字符串数组:一、使用列表(list)列表可以存储多个字符串,类似于其他语言中的数组。#创建一个包含多个字符串的列表string_array=['apple','banana','cherry']print(string_array)二、使用元组(tuple)元组与列表类似,但元组是不可......
  • (免费源码)计算机毕业设计必看必学 原创定制程序 java、PHP、python、小程序、文案全套
    摘 要随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设英语自主学习平台。本设计主要实现集人性化、高效率、便捷等优点于一身的英语自......
  • 新学期必看!豆包MarsCode 教你 5 分钟拿捏 Python 数据分析!
    开学啦!!听说,有同学想在新学期多掌握几门技能?有同学写毕设搞科研不会爬虫?有文科生正心怀毕业转码梦?作为一门实用且能够有效提升个人竞争力的技能,Python的重要性不言而喻。新学期到了,各位壮志满怀想狠狠努力一把的同学们,快来跟着豆包MarsCode 零基础轻松上手Python啦!在上一期「Pyt......
  • python __repr__函数和__str__函数
    __repr__函数和__str__函数都是类似的用于显示类对象的作用。classMyClass:def__init__(self,name):self.name=namedef__repr__(self):#__str__(self)returnself.nameresult=MyClass("repr/str魔法函数")print("MyClasresult:",......
  • python 魔法函数
    概述魔法函数(MagicMethods),是Python的一种高级语法,允许在类中自定义函数(函数名格式一般为__xx__),并绑定到类的特殊方法中。比如在类A中自定义__str__()函数,则在调用str(A())时,会自动调用__str__()函数,并返回相应的结果。在我们平时的使用中,可能经常使用__init__函数(构造函数)和__d......
  • 20240906_150054 python 内容对齐方式 format
    format左右中对齐让数据左对齐"{:!<30}".format(数据)让数据右对齐"{:!>30}".format(数据)让数据居中对齐"{:!^30}".format(数据)......
  • 20240906_150844 python 槽的进制转换
    十进制转二进制b是bit的意思比特十进制转八进制十进制转16进制记忆b,二进制o,八进制x,十六进制......