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

在人工智能的诸多领域中,分类技术扮演着核心角色,其应用广泛而深远。无论是在金融风险评估、医疗诊断、安全监控还是日常的交互式服务中,有效的分类算法都是实现智能决策的关键。随着大数据时代的到来,分类算法面临着前所未有的挑战和机遇。

一方面,海量的数据为算法提供了丰富的学习材料;另一方面,如何从这些数据中提取有价值的信息,构建准确、可靠的分类模型,成为了研究的热点。

Yuanchun Niu撰写


视频

Python贝叶斯分类应用:卷积神经网络分类实例

探索见解

去bilibili观看

探索更多视频

一方面,海量的数据为算法提供了丰富的学习材料;另一方面,如何从这些数据中提取有价值的信息,构建准确、可靠的分类模型,成为了研究的热点。

随后,通过具体的应用实例的代码数据,展示了分类技术在手写字符识别数据等领域的实际应用。

进一步地,本文详细讨论了分类方法的演进,从基于回归的简单分类到基于概率模型的复杂分类策略,再到现代的贝叶斯方法,揭示了分类技术的发展脉络。

特别地,本文重点研究了贝叶斯卷积神经网络(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。

视频

Python、R时间卷积神经网络TCN与CNN、RNN预测时间序列实例

探索见解

去bilibili观看

探索更多视频


视频

卷积神经网络CNN肿瘤图像识别

探索见解

去bilibili观看

探索更多视频


视频

贝叶斯推断线性回归与R语言预测工人工资数据

探索见解

去bilibili观看

探索更多视频


视频

R语言bnlearn包:贝叶斯网络的构造及参数学习的原理和实例

探索见解

去bilibili观看

探索更多视频


自适应网页宽度的 Youku 视频

视频

R语言中RStan贝叶斯层次模型分析示例

探索见解

去bilibili观看

探索更多视频

  • 损失函数: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): def __init__(self, **kwargs): super(PosteriorRecorder, self).__init__(**kwargs)
随后,我们对不同的KL权重进行了模型训练,并对结果进行了记录和分析。


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

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


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

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


我们定义了一个函数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')

过采样SMOTE逻辑回归、SVM、随机森林、AdaBoost和XGBoost对不平衡数据分析预测

阅读文章


为了近似计算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)

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)

关于分析师

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

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498

关注有关新文章的微信公众号


永远不要错过任何见解。当新文章发表时,我们会通过微信公众号向您推送。

技术干货

最新洞察

This will close in 0 seconds