各位朋友,新年好! 随着春节假期的结束,想必大家陆陆续续返回工作岗位,开始新的一年的拼搏。我也会继续努力,争取在深度学习方面更进一步,接下来,我将继续聊一聊深度学习在计算机视觉中的应用。

在前面的《站在巨人的肩膀上:迁移学习》和《再谈迁移学习:微调网络》两篇文章中,我们介绍了迁移学习的强大之处。然而,人们探索新知识总是永无止境,在提高深度学习模型准确率方面,仍在孜孜不倦的追求着。这篇文章将介绍一种提升模型准确率的方法:组合模型。

从字面上理解,组合模型并不难解释,简单说,就是为深度学习建立多个模型,然后用多个模型来预测,采取投票或平均法来决定最后的预测结果。稍微想一想,似乎比较好理解,俗话说,三个臭皮匠,顶个诸葛亮。多个模型投票的结果,应该好于单个模型的准确率。当然,机器学习看起来有些不靠谱(拿概率说事),但还是建立在严密的理论基础之上,组合模型提高准确率如果仅仅建立在一条谚语之上,不足以说服人,也没办法让人接受。

事实上,组合模型是建立在一个称为琴生不等式(Jensen's inequality)之上,该公式以丹麦数学家约翰·琴生(Johan Jensen)命名,给出了积分的凸函数值和凸函数的积分值间的关系。有兴趣的同学可以去Google一下,看看这个公式有何神奇之处,我也找了一些资料,然而...没看懂,只了解其大意是说,可能某个的模型的误差低于所有模型的平均值,但由于我们没有可以用来“选择”此模型的标准,所以我们可以确信所有模型的平均值不会比随机选择一个模型差。是不是还是有些晕乎?嗯,这个不重要,我们用实践来检验一下是不是有效吧。

接下来,我们就要准备训练多个机器学习模型。我们也不用把问题复杂化,设计多种网络结构的模型,最简单的方法是,采用相同的网络结构,甚至使用相同的超参数,但训练出不同的参数。闲话少说,直接上代码:

((trainX, trainY), (testX, testY)) = cifar10.load_data()
trainX = trainX.astype("float") / 255.0
testX = testX.astype("float") / 255.0lb = LabelBinarizer()
trainY = lb.fit_transform(trainY)
testY = lb.transform(testY)labelNames = ["airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "trunk"]aug = ImageDataGenerator(rotation_range=10, width_shift_range=0.1, height_shift_range=0.1, horizontal_flip=True,fill_mode="nearest")for i in np.arange(0, args["num"]):print("[INFO] training model {}/{}".format(i + 1, args["num"]))opt = SGD(lr=0.01, decay=0.01/40, momentum=0.9, nesterov=True)model = MiniVGGNet.build(width=32, height=32, depth=3, classes=10)model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"])H = model.fit_generator(aug.flow(trainX, trainY, batch_size=64), validation_data=(testX, testY), epochs=40,steps_per_epoch=len(trainX)//64, verbose=1)p = [args["models"], "model_{}.model".format(i)]model.save(os.path.sep.join(p))
复制代码

代码比较容易理解,采用cifar10数据集训练,10种类别标签,对输入数据进行了数据扩充(data augmentation),这个数据扩充是随机实时进行,加上训练数据集和验证数据集也是随机划分,所以最后训练出的网络参数有所不同,训练完成之后,将模型序列化到文件,供后面使用。循环num遍,就产生了num个模型。

接下来就是依次加载个模型文件,每个模型分别进行预测,然后取均值:

(testX, testY) = cifar10.load_data()[1]
testX = testX.astype("float") / 255.0
labelNames = ["airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "trunk"]
lb = LabelBinarizer()
testY = lb.fit_transform(testY)model_paths = os.path.join(args["models"], "*.model")
model_paths = list(glob.glob(model_paths))
models = []for (i, model_path) in enumerate(model_paths):print("[INFO] loading model {}/{}".format(i + 1, len(model_paths)))models.append(load_model(model_path))print("[INFO] evaluating ensemble ...")
predictions = []
for model in models:predictions.append(model.predict(testX, batch_size=64))predictions = np.average(predictions, axis=0)
print(classification_report(testY.argmax(axis=1), predictions.argmax(axis=1), target_names=labelNames))复制代码

上面的代码,代码量相对于单个模型而言,并没有增加多少,只是多了一个循环,多了一个取平均值,但训练过程却多了num倍,我用电脑训练5个模型,结果花了一晚上还没有训练完:(

最后测试的结果如何呢?通过组合多个网络的输出,成功将准确度从83%提高到84%,即使这些网络使用完全相同的超参数在同一数据集上进行训练。有数据表明,采用组合模型,通常准确度有1-5%的提升。

看到这儿,你可能会有些失望,费了这么大的劲,好像也没啥提升,但是别忘了,在医疗领域、自动驾驶领域,即使费上好大的力气,准确率能够提升小数点后面几位,都是值得的。就像每年度的kaggle竞赛,人们依然在孜孜不倦的追求着准确率的提升。

以上实例均有完整的代码,点击阅读原文,跳转到我在github上建的示例代码。

另外,我在阅读《Deep Learning for Computer Vision with Python》这本书,在微信公众号后台回复“计算机视觉”关键字,可以免费下载这本书的电子版。

往期回顾

  1. 再谈迁移学习:微调网络
  2. 站在巨人的肩膀上:迁移学习
  3. 聊一聊rank-1和rank-5准确度
  4. 使用数据增强技术提升模型泛化能力

提高模型准确率:组合模型相关推荐

  1. TensorFlow2 大幅提高模型准确率的神奇操作

    TensorFlow2 大幅提高模型准确率的神奇操作 过拟合 Regulation 公式 例子 动量 公式 例子 学习率递减 过程 例子 Early Stopping Dropout 过拟合 当训练集 ...

  2. 深度学习提高模型准确率方法

    这里写目录标题 深度学习 数据 使用更多数据 更改图像大小 减少颜色通道 算法 模型改进 增加训练轮次 迁移学习 添加更多层 调整超参数 总结 深度学习 我们已经收集好了一个数据集,建立了一个神经网络 ...

  3. 迁移学习训练集准确率一直上不去_可以提高你的图像识别模型准确率的7个技巧...

    假定,你已经收集了一个数据集,建立了一个神经网络,并训练了您的模型. 但是,尽管你投入了数小时(有时是数天)的工作来创建这个模型,它还是能得到50-70%的准确率.这肯定不是你所期望的. 下面是一些提 ...

  4. 内涝预测过程的噪音_提高人工智能模型准确率的测试过程中需要注意什么?

    黑马程序员视频库 播妞微信号:boniu236 传智播客旗下互联网资讯.学习资源免费分享平台 现在人工智能行业发展迅猛,那么人工智能产品特别是使用分类算法实现的产品中判断其能否上线通常是通过算法自带的 ...

  5. 使用迁移学习后使用微调再次提高模型训练的准确率

    使用迁移学习后使用微调再次提高模型训练的准确率 1.微调 所谓微调:冻结模型库的底部的卷积层,共同训练新添加的分类器层和顶部部分卷积层.这允许我们"微调"基础模型中的高阶特征表示, ...

  6. 数据挖掘读书笔记--第八章(下):分类:模型评估与选择、提高分类器准确率技术

    散记知识点 --"评估分类器,提高分类器" 5. 模型评估与选择 5.1 评估分类器性能 (1) 评估分类器性能的度量 评估分类器性能的度量主要有:准确率(识别率).敏感度(召回率 ...

  7. 【深度学习】90.94%准确率!谷歌刷新ImageNet新纪录!Model soups:提高模型的准确性和稳健性...

    丰色 发自 凹非寺 转载自:量子位(QbitAI) 如何最大限度地提升模型精度? 最近,谷歌等机构发现: 性能不好的微调模型先不要扔,求一下平均权重! 就能在不增加推理时间以及内存开销的情况下,提高模 ...

  8. Hinton等人最新研究:大幅提升模型准确率,标签平滑技术到底怎么用?

    作者 | Rafael Müller , Simon Kornblith, Geoffrey Hinton 译者 | Rachel 责编 | Jane 出品 | AI科技大本营(ID: rgznai1 ...

  9. 目标检测 YOLOv5 - 如何提高模型的指标,提高精确率,召回率,mAP等

    目标检测 YOLOv5 - 如何提高模型的指标,提高精确率,召回率,mAP等 flyfish 文中包括了YOLOv5作者分享的提高模型指标小技巧和吴恩达(Andrew Ng)在做缺陷检测项目( ste ...

  10. 如何一步一步提高图像分类准确率?

    一.问题描述 当我们在处理图像识别或者图像分类或者其他机器学习任务的时候,我们总是迷茫于做出哪些改进能够提升模型的性能(识别率.分类准确率)...或者说我们在漫长而苦恼的调参过程中到底调的是哪些参数. ...

最新文章

  1. 数据中心级交换机考核方法
  2. VS报错:此项目需要缓解Spectre漏洞的库
  3. spyder matlab,将pycharm配置为matlab或者spyder的用法说明
  4. Dynamic Routing-中科院西交旷视(孙剑团队)提出用于语义分割的动态路由网络,精确感知多尺度目标,代码已开源!...
  5. ruby on rails连接mysql_ruby on rails 连接mysql数据库
  6. springboot服务调用超时_Spring Boot 异步请求和异步调用,一文搞定
  7. c语言中栈的作用,栈(Stack)的概念和应用及C语言实现
  8. 微软 Windows 10 S 之心不死!
  9. gitee添加成员_成员权限管理,到底能有多精细?
  10. [渝粤教育] 郑州工程技术学院 试验设计与数据处理 参考 资料
  11. wps文档服务器授权怎么解,如何解决WPS提示授权已到期的问题
  12. 《智豆SOW白皮书》重磅发布 附全文
  13. 什么是python语言的解释性?
  14. 粒子群优化算法PSO
  15. 蚂蚁金融NLP竞赛——文本语义相似度赛题总结
  16. 无限制神器aria2懒人包及Aria2配置/Web管理面板教程
  17. 着色Shading(1)(光照、着色)(笔记)
  18. OPNET入门2-Basic Process
  19. react:制作新页面
  20. 巨大的市场潜力,细数2019国内云计算新排名

热门文章

  1. BZOJ4319: cerc2008 Suffix reconstruction Suffix Array 的理解
  2. github手把手使用教程
  3. ipadpro尺寸的html,iPad Pro尺寸到底有多大?
  4. UIBezierPath+画板,签名档
  5. mysql主从同步创建表不同步_MySQL新增数据库到主从同步列表 - 如何增加数据库到MySQL主从 - MySQL主从不同步解决办法...
  6. Kafka工具--雅虎CMAK
  7. grpc实现流量染色
  8. 狭义货币供应量M1的同比增速对我国股市影响最直接
  9. 洛谷P1563 玩具谜题
  10. 服务器共享文件设成禁止删除,服务器共享文件夹权限 禁止删除共享文件方法...