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

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

时间:2024-09-07 14:23:34浏览次数:14  
标签:X光 Python BCNN 分类 贝叶斯 tf 类别 数据 fn


分析师: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,用于记录后验标准差。

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



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

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



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

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

 

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

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

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

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



import warnings
warnings.filterwarnings('ignore')

import tensorflow as tf  # 2.8.0
import tensorflow_probability as tfp  # 0.16

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



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

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

 

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

 

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

 

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

def get_classes(dataset: tf.data.Dataset) -> np.ndarray:
    counts = []
    for image, label in dataset:
        counts.append(np.argmax(label, axis=-1))

# 使用Seaborn库绘制类别分布图
sns.countplot(class_names_test, ax=ax[1])
ax[1].set_title('Test set')
fig.suptitle('Class distribution')

 

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

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



def kl_approx(q, p, q_tensor):
    return tf.reduce_mean(q.log_prob(q_tensor) - p.log_prob(q_tensor))

divergence_fn = lambda q, p, q_tensor: kl_approx(q, p, q_tensor) / (len(train_classes))

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



def get_convolution_reparameterization(filters, kernel_size, activation, strides=1, padding='SAME', prior=prior, divergence_fn=divergence_fn, name=None) -> tfpl.Convolution2DReparameterization:
    """
    返回一个Convolution2DReparameterization层。
    """
    return tfpl.Convolution2DReparameterization(
        filters=filters,
        kernel_size=kernel_size,
        activation=activation,
        strides=strides,
        padding=padding,
        kernel_posterior_fn=tfpl.default_mean_field_normal_fn(is_singular=False),
        kernel_prior_fn=prior,
        kernel_divergence_fn=divergence_fn,
        bias_posterior_fn=tfpl.default_mean_field_normal_fn(is_singular=False),
        bias_prior_fn=prior,
        bias_divergence_fn=divergence_fn,
        name=name)

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



feature_extractor = tf.keras.applications.DenseNet121(include_top=False, input_shape=(224, 224, 3), weights='imagenet')
feature_extractor.summary()

# 构建贝叶斯ResNet模型
# ...

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



model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), loss=nll, metrics=[tf.keras.metrics.CategoricalAccuracy()])

callbacks = [
    tf.keras.callbacks.EarlyStopping(monitor='val_categorical_accuracy', patience=7, restore_best_weights=True, verbose=1),
    tf.keras.callbacks.ReduceLROnPlateau(monitor='val_categorical_accuracy', min_lr=1e-9, factor=0.1, patience=3, verbose=1)
]

model.fit(train_ds, epochs=64, validation_data=test_ds, callbacks=callbacks)

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

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

 

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

 

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

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

关于分析师

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

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

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

 

标签:X光,Python,BCNN,分类,贝叶斯,tf,类别,数据,fn
From: https://blog.51cto.com/tecdat/11944902

相关文章

  • Python复杂网络社区检测:并行谱聚类算法设计与多种算法应用实战研究
     分析师:LeiyunLiao在当今的网络科学领域,复杂网络中的社区检测成为了一个至关重要的研究课题。随着信息技术的飞速发展,各种大规模网络不断涌现,如社交网络、生物网络等。准确地识别这些网络中的社区结构,对于理解网络的功能、行为以及潜在的规律具有重大意义。网络社团划分算法作为......
  • Python用CNN+LSTM+Attention对新闻文本分类、锂离子电池健康、寿命数据预测
     分析师:WeiqiaoJue在当今的数字化时代,数据的爆炸式增长既带来了机遇,也带来了挑战。如何从海量的数据中高效地提取有价值的信息,并进行准确的分类和预测,成为了众多领域亟待解决的关键问题。本研究通过CNN+LSTM+Attention模型提高新闻文本分类的精确性的案例,结合Attention+CNN+BiLST......
  • opencv-python学习笔记2-opencv基本操作
    目录 一、opencv架构:(1)OpenCV的主要模块包括:(2)OpenCV的架构特点:(3)OpenCV的应用场景:二、图像输入输出模块imgcodecs: a.imread:b. imwrite:三、opencv界面编程:(1)创建窗口:(2)显示图像:(3)添加滑块:(4)处理鼠标事件:(5)等待用户输入(6)销毁窗口四、单窗口显示多图片:(1)np.hstack()......
  • 【小白深度教程 1.11】手把手教你使用 PSMNet 估计视差和计算深度,并映射到 3D 点云(含
    【小白深度教程1.11】手把手教你使用PSMNet估计视差和计算深度,并映射到3D点云(含Python代码)1.PSMNet简介2.环境配置3.下载预训练模型4.修改推理代码5.用PSMNet估计视差6.报错解决7.映射到3D点云8.对比传统方法9.点云可视化在之前的章节......
  • 计算机毕业设计选题-基于python的企业人事管理系统【源码+文档+数据库】
    ......
  • Python教程(二十一) : 从零开始制作计算器应用【PyQt6】
    文章目录专栏列表环境准备代码解析主要组件初始化界面布局设置事件处理计算逻辑运行应用完整代码示例截图总结注意专栏列表Python教程(十):面向对象编程(OOP)Python教程(十一):单元测试与异常捕获Python教程(十二):面向对象高级编程详解Python教程(十三):常用内置模块详解Python......
  • 【Python系列】使用切片移动元素位置
    ......
  • python镜像库替换为国内镜像
    全局生效,而非单个项目!!windows系统使用命令:type%USERPROFILE%\pip\pip.ini查看是否有pip.ini文件,没有的话创建该文件,可以在C:\Users\username下使用notepad++等编辑pip.ini文件,添加下面代码:[global]index-url=https://mirrors.aliyun.com/pypi/simple/[install]trust......
  • Python 中文分词
    Python中文分词结巴中文分词https://github.com/fxsjy/jieba安装 pipinstalljiebapipinstallpaddlepaddle 20.5.1. 分词演示 #encoding=utf-8importjiebaimportpaddlepaddle.enable_static()jieba.enable_paddle()#启动paddle模式。strs=[......
  • Python 语音识别
    STT(SpeechToText)语音转文本17.2.1. SpeechRecognitionhttps://github.com/Uberi/speech_recognition17.2.1.1. 安装 pipinstallSpeechRecognition 麦克风相关 brewinstallportaudiopipinstallpyaudio 运行下面命令授权访问麦克风 ......