原文链接: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, 490for 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: 153Trainable params: 153Non-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.0weights = [exp(-i/alpha) for i in range(1, n_members+1)]

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

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

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

 

拓端tecdat|在python 深度学习Keras中计算神经网络集成模型相关推荐

  1. Python深度学习实例--基于卷积神经网络的小型数据处理(猫狗分类)

    Python深度学习实例--基于卷积神经网络的小型数据处理(猫狗分类) 1.卷积神经网络 1.1卷积神经网络简介 1.2卷积运算 1.3 深度学习与小数据问题的相关性 2.下载数据 2.1下载原始数据 ...

  2. 深度学习算法中卷积神经网络的应用

    下面一起来探讨一下关于深度学习算法中卷积神经网络的基本概念和应用: 1.卷积神经网络基本概念 卷积神经网络也是在传统人工神经网络的基础上发展起来的,它与 BP 神经网络有很大的相似之处,但也有很大的区 ...

  3. python深度学习--Keras函数式API(多输入,多输出,类图模型)

    import numpy as np import pandas as pd import matplotlib.pyplot as plt import pylab from pandas impo ...

  4. 《Python深度学习》Chapter 2——神经网络的数学基础

    <Deep Learning with Python >由Keras之父.现任Google人工智能研究员的弗朗索瓦•肖莱(François Chollet)执笔,详尽介绍了用Python和 ...

  5. [学习笔记] python深度学习---第三章 神经网络入门

    一.神经网络剖析 1. 训练神经网络主要围绕以下四个方面: (1) 层,多个层组合成网络(或模型). (2)输入数据和相应的目标. (3)损失函数,即用于学习的反馈信号. (4)优化器,决定学习过程如 ...

  6. Python 深度学习 Class 2:神经网络的数学基础

    目录 2.1 初始神经网络 1.加载Mnist数据集 2.网络架构 3.编译步骤 4.准备图像数据 5.准备标签 6.训练网络 2.2 数据表示 1.标量 2.向量 3.矩阵 4.高维张量 5.关键属 ...

  7. 基于C++的简单深度学习ANN(人工神经网络)模型

    使用C++实现的简单ANN(人工神经网络) github地址 使用C++实现的最简单的人工神经网络,包含梯度下降的反向传播算法(BP).内有部分注释,适合初学学习.至于为什么不用python?还是觉得 ...

  8. 吴恩达深度学习 —— 3.3 计算神经网络的输出

    如图是一个两层的神经网络,让我们更深入地了解神经网络到底在计算什么. 我们之前说过逻辑回归,下图中的圆圈代表了回归计算的两个步骤,首先按步骤计算出z,然后在第二部计算激活函数,就是函数sigmoid( ...

  9. Python深度学习(4):猫狗分类

    这个项目使用卷积神经网络,<Python深度学习>中使用了两个方法实现.一个是自己搭建卷积网络,另一个是直接使用VGG16.其中直接使用VGG16又可以分为抽取特征和微调模型两种方法. 1 ...

  10. Python深度学习篇

    Python深度学习篇一<什么是深度学习> Excerpt 在过去的几年里,人工智能(AI)一直是媒体大肆炒作的热点话题.机器学习.深度学习 和人工智能都出现在不计其数的文章中,而这些文章 ...

最新文章

  1. 敏捷开发实践—任务看板
  2. 怎样在python代码中输入π_鼠标自动点击、键盘自动输入?几行Python代码搞定
  3. 【最短路】【spfa】小vijos P1447 Updown
  4. webpack打包后引用cdn的js_呕心沥血编写的webpack多入口零基础配置 【建议收藏】...
  5. IOS之仿微信运动项目
  6. Webpack进阶(一) tree shaking与不同mode
  7. JavaScript对SEO的影响及解决之道
  8. myeclipse怎么导入mysql驱动_myeclipse sql导入数据库驱动包
  9. 双11大考 POLARDB分钟级弹性让企业轻松扩展 1
  10. ubuntu下安装Node.js(源码安装)
  11. WORD限制别人只能填写窗体而不能修改文档其他内容?
  12. 让C68平台“冷又静”
  13. python符号格式化设置区间_[Python3 填坑] 001 格式化符号 格式化操作符的辅助指令...
  14. 三维重建之环境搭建1-VS2017安装
  15. css标签选择器、类名选择器、多类名选择器
  16. 自抗扰控制(ADRC)—— 一阶系统
  17. 【数据结构与算法】1.2 数据结构与算法分析
  18. 计算机除氧化的方法,内存条氧化了的解决方法
  19. unity 画球面_Unity实现球面行走
  20. 中班科学计算机,中班科学活动《蜗牛吃什么》

热门文章

  1. bash脚本基础概念注意点
  2. 【Webcam设计】相机底层工作流程,编程模型
  3. 凸优化第五章对偶 5.3 几何解释
  4. 【HAVENT原创】前端使用 jsrsasign 进行 RSA 加密、解密、签名、验签
  5. wpf 开发 -TextBox背景自定义-Decorator
  6. 恋恋风辰 对于redis底层框架的理解(一)
  7. Javascript的函数直接量定义
  8. MAC OS git客户端安装及操作
  9. php7.1.1一键安装/配置文件简单优化
  10. JVM学习(1)——通过实例总结Java虚拟机的运行机制