在python 深度学习Keras中计算神经网络集成模型

原文链接:http://tecdat.cn/?p=7227

神经网络的训练过程是一个挑战性的优化过程,通常无法收敛。

这可能意味着训练结束时的模型可能不是稳定的或表现最佳的权重集,无法用作最终模型。

解决此问题的一种方法是使用在训练运行结束时多个模型的权重平均值。

平均模型权重

学习深度神经网络模型的权重需要解决高维非凸优化问题。

解决此优化问题的一个挑战是,有许多“ 好的 ”解决方案,学习算法可能会反弹而无法稳定。

解决此问题的一种方法是在训练过程即将结束时合并所收集的权重。通常,这可以称为时间平均,并称为Polyak平均或Polyak-Ruppert平均,以该方法的原始开发者命名。

Polyak平均通过优化算法访问的参数空间将轨迹中的几个点平均在一起。

多类别分类问题

我们使用一个小的多类分类问题作为基础来证明模型权重集合。

该问题有两个输入变量(代表点的xy坐标),每组中点的标准偏差为2.0。


# 生成2D分类数据集X, y = make_blobs(n_samples=1000, centers=3, n_features=2, cluster_std=2, random_state=2)

结果是我们可以建模的数据集的输入和输出元素。

为了了解问题的复杂性,我们可以在二维散点图上绘制每个点,并通过类值对每个点进行着色。


# 数据集的散点图



# 生成2D分类数据集

# 每个类值的散点图

for class_value in range(3):

# 选择带有类别标签的点的索引

row_ix = where(y == class_value)

# 不同颜色点的散点图

pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

# 显示图

运行示例将创建整个数据集的散点图。我们可以看到2.0的标准偏差意味着类不是线性可分离的(由线分隔),从而导致许多歧义点。

多层感知器模型

在定义模型之前,我们需要设计一个集合的问题。

在我们的问题中,训练数据集相对较小。具体来说,训练数据集中的示例与保持数据集的比例为10:1。这模仿了一种情况,在这种情况下,我们可能会有大量未标记的示例和少量带有标记的示例用于训练模型。

该问题是多类分类问题,我们 在输出层上使用softmax激活函数对其进行建模。这意味着该模型将预测一个具有三个元素的向量,并且该样本属于三个类别中的每个类别。因此,我们必须先对类值进行编码,然后再将行拆分为训练和测试数据集。




# 分为训练和测试



trainX, testX = X[:n_train, :], X[n_train:, :]

trainy, testy = y[:n_train], y[n_train:]

接下来,我们可以定义和编译模型。

该模型将期望具有两个输入变量的样本。然后,该模型具有一个包含25个节点的隐藏层和一个线性激活函数,然后是一个具有三个节点的输出层(用于预测三种类别中每个类别的概率)和一个softmax激活函数。


# 定义模型



model.add(Dense(25, input_dim=2, activation='relu'))

model.add(Dense(3, activation='softmax'))

opt = SGD(lr=0.01, momentum=0.9)

model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])

最后,我们将在训练和验证数据集上的每个训练时期绘制模型准确性的学习曲线。


# 学习模型精度曲线

pyplot.plot(history.history['acc'], label='train')

pyplot.plot(history.history['val_acc'], label='test')

pyplot.legend()

pyplot.show()

在这种情况下,我们可以看到该模型在训练数据集上达到了约86%的准确度 。

Train: 0.860, Test: 0.812

显示了在每个训练时期的训练和测试集上模型精度的学习曲线。

在每个训练时期的训练和测试数据集上模型精度的学习曲线

将多个模型保存到文件

模型权重集成的一种方法是在内存中保持模型权重的运行平均值。

另一种选择是第一步,是在训练过程中将模型权重保存到文件中,然后再组合保存的模型中的权重以生成最终模型。


#模型拟合

n_epochs, n_save_after = 500, 490

for i in range(n_epochs):

# 适合单个模型

model.fit(trainX, trainy, epochs=1, verbose=0)

# 检查我们是否应该保存模型

if i >= n_save_after:

model.save('model_' + str(i) + '.h5')

将模型保存到文件中。

pip install h5py

将10个模型保存到当前工作目录中。

具有平均模型权重的新模型

首先,我们需要将模型加载到内存中。


# 从文件加载模型





def load_all_models(n_start, n_end):

all_models = list()

for epoch in range(n_start, n_end):



# 从文件加载模型





model = load_model(filename)





print('>loaded %s' % filename)

return all_models

我们可以调用该函数来加载所有模型。



# 按顺序加载模型





members = load_all_models(490, 500)

print('Loaded %d models' % len(members))

加载后,我们可以使用模型权重的加权平均值创建一个新模型。

将这些元素捆绑在一起,我们可以加载10个模型并计算平均加权平均值(算术平均值)。

首先运行示例将从文件中加载10个模型。

从这10个模型中创建一个模型权重集合,为每个模型赋予相等的权重,并报告模型结构的摘要。


_________________________________________________________________Layer (type) Output Shape Param #=================================================================dense_1 (Dense) (None, 25) 75

_________________________________________________________________dense_2 (Dense) (None, 3) 78

=================================================================

Total params: 153

Trainable params: 153

Non-trainable params: 0

_________________________________________________________________

使用平均模型权重集合进行预测

既然我们知道如何计算模型权重的加权平均值,我们就可以使用生成的模型评估预测。

一个问题是,我们不知道要结合多少模型才能获得良好的性能。我们可以通过评估最近n个模型的模型权重平均合集来解决此问题,并改变n以查看有多少个模型产生良好的性能。


# 反向加载模型,所以我们首先用最后一个模型来构建整体



members = list(reversed(members))# 选择一个成员的子集



subset = members[:n_members]# 准备一个权重相等的数组



weights = [1.0/n_members for i in range(1, n_members+1)]# 用所有模型权重的加权平均值创建一个新的模型





model = model_weight_ensemble(subset, weights)# 作出预测和评价精度





_, test_acc = model.evaluate(testX, testy, verbose=0)

return test_acc

然后,我们可以评估从从最后1个模型到最后10个模型的训练运行中保存的最近n个模型的不同数量创建的模型。除了评估组合的最终模型外,我们还可以评估测试数据集上每个保存的独立模型以比较性能。



# 计算等待集合上不同数量的集合





single_scores, ensemble_scores = list(), list()

for i in range(1, len(members)+1):

可以绘制收集的分数,蓝色点表示单个保存的模型的准确性,橙色线表示组合了最后n个模型的权重的模型的测试准确性。



#绘制得分和集合模型数量

x_axis = [i for i in range(1, len(members)+1)]

pyplot.plot(x_axis, single_scores, marker='o', linestyle='None')

pyplot.plot(x_axis, ensemble_scores, marker='o')

pyplot.show()

首先运行示例将加载10个保存的模型。

报告每个单独保存的模型的性能以及整体模型的权重,该模型的权重是从所有模型(包括每个模型)开始平均计算的,并且从训练运行的末尾开始向后工作。

结果表明,最后两个模型的最佳测试精度约为81.4%。我们可以看到模型权重集合的测试准确性使性能达到平衡,并且表现也一样。

我们可以看到,对模型权重求平均值确实可以使最终模型的性能达到平衡,至少与运行的最终模型一样好。

线性和指数递减加权平均值

我们可以更新示例,并评估集合中模型权重的线性递减权重。

权重可以计算如下:


# 准备一个权值线性递减的数组





weights = [i/n_members for i in range(n_members, 0, -1)]

运行示例将再次报告每个模型的性能,这一次是每个平均模型权重集合的测试准确性,模型的贡献呈线性下降。

我们可以看到,至少在这种情况下,该集合的性能比任何独立模型都小,达到了约81.5%的精度。

我们还可以对模型的贡献进行指数衰减的实验。这要求指定衰减率(α)。下面的示例为指数衰减创建权重,其下降率为2。


# 准备一个按指数递减的权重数组





alpha = 2.0

weights = [exp(-i/alpha) for i in range(1, n_members+1)]

下面列出了模型对集合模型中平均权重的贡献呈指数衰减的完整示例。

运行该示例显示出性能的微小改进,就像在保存的模型的加权平均值中使用线性衰减一样。

测试准确性得分的线图显示了使用指数衰减而不是模型的线性或相等权重的较强稳定效果。

(0)

相关推荐

  • 如何为应用选择正确的机器学习算法

    听您的数据,遵循您的目标- 刚开始学习和实践数据科学与机器学习时,我会查找资源和教程以实施和使用特定的机器学习算法. 互联网上充满了教您如何使用算法,算法如何工作以及如何将其应用于数据的材料. 但是, ...

  • sklearn入门教程:监督学习流程与线性分类器

    监督学习是机器学习中的一个方法,其原理是根据已有经验知识对未知样本的目标/标记进行预测.根据目标预测变量的类型不同,我们可以把监督学习任务大体分为分类学习(预测一个分类标签)与回归预测(函数输出是一个 ...

  • 如何避免机器学习中的「7」种数据偏差

    机器学习中的数据偏差是一种错误,其中数据集的某些元素比其他元素具有更大的权重和或表示.有偏见的数据集不能准确地表示模型的用例,从而导致结果偏斜,准确性水平低和分析错误. 通常,用于机器学习项目的训练数 ...

  • 使用 MinDiff 框架减轻 ML 模型中的不公平偏见

    视频介绍:使用 MinDiff 框架减轻 ML 模型中的不公平偏见 机器学习 (ML) 的负责任研发可以在帮助解决各种社会挑战方面发挥关键作用.在谷歌,我们的研究反映了我们的人工智能原则,从帮助保护患 ...

  • 创伤性颅内出血死亡率的预测因素:国家创伤数据库研究

    写在前面     TBI是世界范围内死亡的主要原因.预后建模利用患者数据预测TBI的各种结果,提供了独特的机会来协助临床推理和简化决策.此前若干项研究已经使用临床和放射学数据开发了创伤性脑损伤预后的预 ...

  • 利用深度学习(Keras)进行癫痫分类-Python案例

    更多技术干货第一时间送达 癫痫 癫痫,即俗称"羊癫风",是由多种病因引起的慢性脑功能障碍综合症,是仅次于脑血管病的第二大脑部疾病.癫痫发作的直接原因是脑部神经元反复地突发性过度放电 ...

  • Python深度学习02:神经网络的数学基础

    2.1 初始神经网络 MNIST数据集:手写数字的灰度图像(28 像素×28 像素),包含 60 000 张训练图像和 10 000 张测试图像. 类:分类问题中的某个类别叫作类(class) 样本: ...

  • R语言深度学习Keras循环神经网络(RNN)模型预测多输出变量时间序列

    原文链接:http://tecdat.cn/?p=23902 递归神经网络被用来分析序列数据.它在隐藏单元之间建立递归连接,并在学习序列后预测输出. 在本教程中,我们将简要地学习如何用R中的Keras ...

  • 【深度学习】收藏|神经网络调试Checklist

    前言 作为一名每天与神经网络训练/测试打交道的同学,是否经常会遇到以下这几个问题,时常怀疑人生: 怎么肥事,训练正常着呢,咋效果这么差呢? 嗯..再等等是不是loss就更低了.啊?明明loss更低了呀 ...

  • Python深度学习基于PyTorch(附完整PPT下载)

    人工智能与算法学习 24篇原创内容 公众号 作者:吴茂贵,资深大数据和人工智能技术专家,就职于中国外汇交易中心,在BI.数据挖掘与分析.数据仓库.机器学习等领域工作超过20年!在基于Spark.Ten ...

  • 人工智能深度学习系统的基石——神经网络简介

    神经网络简介 神经网络是深度学习系统的基石.为了在深度学习方面取得成功,我们需要从回顾神经网络的基础知识开始,包括架构.神经网络算法等等. 什么是神经网络? 神经网络技术起源于上世纪五.六十年代,当时 ...

  • 边缘智能——深度学习和边缘计算

    随着深度学习的突破,近年来人工智能(AI)应用和服务蓬勃发展.在移动计算和物联网进步的推动下,数十亿移动和物联网设备连接到互联网,在网络边缘生成数以亿计的数据字节. 在人工智能和物联网的驱动下,迫切需 ...

  • 推荐系统遇上深度学习(一零六)-神经网络与逻辑推理相结合的NLR框架

    推荐系统遇上深度学习(一零六)-神经网络与逻辑推理相结合的NLR框架

  • 【NLP】 深度学习NLP开篇-循环神经网络(RNN)

    从这篇文章开始,有三AI-NLP专栏就要进入深度学习了.本文会介绍自然语言处理早期标志性的特征提取工具-循环神经网络(RNN).首先,会介绍RNN提出的由来:然后,详细介绍RNN的模型结构,前向传播和 ...