全文链接: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,假设它们来自具有最大似然的高斯分布 (μ*,Σ*)。
- 高斯分布的概率密度函数用特定形式表示。
- 似然函数 L (μ,Σ) 为多个概率密度函数的乘积形式。
- 通过最大似然估计确定参数 μ*,Σ*=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
,用于记录后验标准差。
- class PosteriorRecorder(tf.keras.callbacks.Callback):
- def __init__(self, **kwargs):
- super(PosteriorRecorder, self).__init__(**kwargs)
随后,我们对不同的KL权重进行了模型训练,并对结果进行了记录和分析。
最后,我们绘制了不同KL权重下后验标准差的图表,以直观展示其对模型性能的影响。
- scaler = Scaler()
- x = scaler.fit_transform(x)
贝叶斯卷积神经网络在胸部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)
为了更好地理解数据集,我们探索了数据集中的图像和标签,并检查了类别分布。
我们定义了一个函数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')
为了近似计算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):
- # ...
- # 分析模型预测
通过上述研究,我们展示了贝叶斯CNN在处理数据和真实数据时的有效性和灵活性。我们的研究为未来在更复杂的数据集上应用贝叶斯深度学习模型提供了有价值的参考。
关于分析师
在此对 Yuanchun Niu 对本文所作的贡献表示诚挚感谢,他完成了控制科学与工程专业的硕士研究生学位,专注深度学习、机器学习领域。擅长汇编语言、Python。
标签:X光,Python,BCNN,分类,贝叶斯,tf,类别,数据,fn From: https://www.cnblogs.com/tecdat/p/18400628