教你编写一个机器学习代码也能使用的单元测试

摘要: 想不想节省重新训练数据的时间?想不想让你的研究成果有个质的飞跃?来看看这些单元测试,助你一臂之力。


注:这篇文章自从发布出来,就受到读者的好评和关注,因此,我编写了一个机器学习测试库,请点击链接查看!

在过去的一年里,我花了很多时间来研究深度学习,并且也犯过很多错误,这些错误不仅帮助我对机器学习有了更加深入的理解,也让我学会了如何正确合理的设计这些系统。在Google Brain工作期间,我学到了很多设计原则,其中之一就是单元测试可以制定或打破原有的算法,并且能够节省数周的调试和训练时间。

然而,到目前为止,似乎还没有为神经网络代码编码测试单元的比较可靠的教程。即使是在OpenAI上,也只是通过一行行的盯着代码来发现bug,然后再思考导致这一bug的原因到底是什么。显然,大部分人都不愿意这么耗费时间,因此,我希望看完这个教程,你就可以开始着手测试你的系统!

我们从一个简单的例子开始:试试在这段代码中找到bug。

 

有找到bug?实际上,这个神经网络并没有进行堆叠。我在编写代码的时候,只是对slim.conv2d(...)代码行做了简单的复制粘贴,然后对内核大小进行修改,而并没有实际的输入。

略微尴的来说,这其实是我上周编写的代码……这是个很重要的教训!但是由于某些原因,这些bug很难被发现:

1.这段代码永远不会崩溃,或者引发错误,又或者是运行速度变慢。

2.这个神经网络仍在训练,并且损失函数会越来越小。

3.几个小时后,会收敛到某一数值,结果非常糟糕,但是,你又不知道应该修改哪里。

当唯一的反馈只有最终那个错误验证时,那么,你只有一个办法——就是搜索整个网络架构。不用再多说了,你需要的是一个更好的网络系统。

在我们对数据进行了一整天的训练以后,该如何发现这一bug呢? 我们发现,最容易注意到的是,层的值实际上从未到达函数外的任何其他张量。因此,假设我们有某种类型的损失函数和优化器,这些张量永远都不会得到优化,它们将始终保持为默认值。

通过简单的训练,我们来比较训练之前和训练之后的结果:

 

在这不到15行的代码中,我们基本上验证了训练过的所有的变量。

这个测试非常简单、实用。现在,假设我们已经修复了上一个问题,现在,添加一些批量优化,看看是否能发现这一bug。

 

看到了没?这个非常微妙。在tensorflow中,batch_norm实际上将is_training默认为False,所以添加这行代码并不能在训练期间将输入规范化!值得庆幸的是,我们编写的最后一个单元测试将会立刻找到这个问题!

我们来看另外一个例子,来自于reddit的一个帖子:该作者想创建一个分组器,其输出范围为(0,1),你是否能够找出其中的bug?

 

这个bug很难发现,并且稍不注意就会导致特别混乱的结果。基本上,这个预测只有一个输出,当你使用softmax交叉熵时,总会导致损失函数为0。

测试这段代码最简单的方法就是——确保损失函数永远不为0。

 

这个测试类似于我们的第一个测试,唯一不同的就是回退。在这个测试中,你可以确保只训练你想要训练的变量。拿生成对抗网络来(GAN)说,常常出现的bug就是忘记在优化期间训练了哪些变量,类似这种的bug经常会发生。

 

这其中最大的问题就是:优化器有一个默认设置来优化所有的变量。对于类似于对抗生成网络的架构来说,这是对所有训练时间判了一个死刑。在这里,使用下面的测试代码,你就可以轻松检测到这些bug:

 

同样,我们也可以为鉴别器或其它强化学习算法编写类似的测试代码。很多演员-评论模型都有自己相对独立的网络,需要通过不同的损失进行优化。

为了你在阅读完本文后,能够更好的进行测试,我认为以下几个建议很重要:

1.保证测试的确定性。如果你真的想要随机输入数据,那么,请确保输入的随机性,以便于轻松的完成测试。

2.保证测试的简短性。一定要有能够训练收敛并检查验证集的单元测试,否则你就是在浪费时间。

3.确保在每次测试前重置图表。

总之,还会有很多测试方法可以测试这些算法。花一个小时的时间来编写一个测试代码,不仅可以帮你节省重新训练的时间,还能够大大改善你的研究成果!

文章原标题《How to unit test machine learning code

原文链接

本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手机pdf文件转语音_没有电脑也能处理PDF文件,手机里的这个功能太强大!

没电脑怎么处理PDF文件?急,在线等!PDF文件因为它的强大兼容性而广泛使用,一半我们都是在电脑打开,如果你刚好没办法使用电脑怎么办?一般来说,我们手机还是能直接打开进行浏览的,以在…

图文+动画讲解排序算法总结!!

戳蓝字“CSDN云计算”关注我们哦!作者 | 大数据肌肉猿责编 | 阿秃很多同学算法零基础,我都不建议他们直接去刷「剑指offer」和「LeetCode」,可以从常见的查找和排序算法开始学起,本期我先整理了常见排序算法,大家可以收…

SpringMVC项目 使用IDEA快速构建

文章目录一、使用idea构建基础项目1. 创建一个新的项目2. 选择maven项目构建架子3. 项目储存路径4. 配置maven和仓库5. 自动下载所需依赖二、初始化项目结构2.1. 创建Java和resources文件夹2.2. 给文件夹赋予目录结构层级2.3. 初始化pom.xml2.4. 初始化web.xml2.5创建配置文件2…

GDPR到底是如何影响机器学习的?

摘要: GDPR时代来临,你的机器学习模型还能训练吗?一般数据保护条例(GDPR)对数据科学产生了很大的影响。现在GDPR有99条正文条款和173篇声明(Recital),长而复杂,但是随着时…

iphone字体_iPhone 适合老人盘吗?

过年的时候,有多少人会选择给家里的老人购买一台新智能手机做为礼物呢?又有多少人选择赠送的手机是 iPhone 呢? (图片来自网络)很久以前,咆哥就看见很多有关‘ iPhone ’是否可以作为孝心机的话题&#xff…

干货 | 金融级消息队列的演进 — 蚂蚁金服的实践之路

摘要: 小蚂蚁说: 消息队列作为一个数据的集散中心,承载了越来越多的场景和数据,从最开始的 OLTP 到 OLAP,甚至再到物联网、人工智能、机器学习等场景,都有很大的想像空间。 在能力上,消息队列现…

海底光缆,到底是怎么安装和维护的?

戳蓝字“CSDN云计算”关注我们哦!作者 | 鲜枣课堂责编 | 阿秃大家应该都知道海底光缆是什么吧?没错!简单来说,就是埋在海底的光纤线缆。如今这个时代,我们每天都在上网。通过上网,我们可以随时和世界各地保…

android padding作用,android:padding和android:layout_margin的区别

简单点来说:android:padding是内边距,控件本身的内容与控件边缘的距离。android:layout_margin是外边距,控件与其他控件之间的距离。下面以具体的例子来进行解释:1、不设置边距android:layout_width"match_parent"andro…

8张图理解Java

摘要: 一图胜千言,下面图解均来自Program Creek 网站的Java教程,目前它们拥有最多的票选。如果图解没有阐明问题,那么你可以借助它的标题来一窥究竟。8张图理解Java一图胜千言,下面图解均来自Program Creek 网站的Java…

云栖大会|十年阿里云存储进化史:今天最好的表现就是明天最低的要求

戳蓝字“CSDN云计算”关注我们哦!科技创新的能力仍然是俘获市场用户的必要条件,而善于发现新需求的敏锐嗅觉以及直面挑战的魄力,更是巨头企业的绝杀武器。随着大数据、人工智能等新兴技术的发展,图像语音识别、智能机器人、自动驾…

他在阿里的逆袭,只因为想做个“锤子”

摘要: 我叫孟白,这是我在阿里的第五年。这五年,我从一个外包工程师,到同事眼中的“铁打的”技术专家。填过无数次坑,也无数次想过放弃。留在阿里,是因为同事一句无意间的玩笑:“你只能做钉子&am…

vb6 判断打印机是否有效_讲述3D打印机怎么用 初学者必看

许多朋友买来了3D打印机,但却不知道如何下手,其实,3D打印机远远没那么复杂。那么,今天就来简单说一下3D打印机怎么用?第一步:创建模型想要玩转3D打印,最重要也是必不可少的环节就是建模!现在可以绘制三维图…

Intellij Idea 离线安装插件

一、idea插件下载地址 http://plugins.jetbrains.com/ 二、下载插件 安装插件 1、下载插件&#xff1a; 2、安装插件&#xff1a; settings -> plugins -> install plugin from disk&#xff0c;然后重启IDEA即可。 <!-- https://mvnrepository.com/artifact/org…

android dialog自定义圆角,Android自定义Dialog实现通用圆角对话框

前言&#xff1a;圆角对话框在项目中用的越来越多&#xff0c;之前一篇文章有介绍过使用系统的AlertDialogCardView(Android中使用CardView实现圆角对话框)实现了圆角对话框的样式&#xff0c;今天介绍自定义Dialog实现通用的圆角对话框。效果图&#xff1a;1.继承自AlertDialo…

漫画:什么是囚徒困境?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 小灰责编 | 刘丹故事发生在小灰小时候......囚徒困境讲的是一件怎样的事情呢&#xff1f;话说某一天&#xff0c;警察抓到了嫌疑犯小A和小B&#xff0c;虽然明知道他们肯定是罪犯&#xff0c;却没有决定性的证据。于是警察想…

Dubbo Cloud Native 之路的实践与思考

摘要&#xff1a; Cloud Native 应用架构随着云技术的发展受到业界特别重视和关注&#xff0c;尤其是 CNCF&#xff08;Cloud Native Computing Foundation&#xff09;项目蓬勃发展之际。Dubbo 作为服务治理的标志性项目&#xff0c;自然紧跟业界的潮流&#xff0c;拥抱技术的…

android mtk 按键,Android 4.0 虚拟按键、手机模式、平板模式(转)

nullem;text-align:left">平台信息:内核&#xff1a;linux2.6/linux3.0系统&#xff1a;android/android4.0平台&#xff1a;S5PV310(samsungExynos4210/4412)作者&#xff1a;xubin341719(欢迎转载&#xff0c;请注明作者) 三星新拿回来来的BSP&#xff0c;编译后没…

y电容如何选型_干式试验变压器选型依据

湖北中试高测电气控股有限公司为您解答&#xff1a;干式试验变压器选型依据干式试验变压器是电力系统中常用的设备之一&#xff0c;适用于各种电气设备绝缘性能的现场检测。当前市面上的干式试验变压器品牌、种类众多&#xff0c;如何才能选购到最适合自己使用的产品呢&#xf…

eplan如何导入access_EPLAN如何助力汽车行业的智能制造转型?

本文从汽车行业智能制造建设需求出发&#xff0c;结合EPLAN服务全球汽车行业企业实现智能制造的最佳实践&#xff0c;介绍了EPLAN在汽车行业智能制造建设过程中所能提供的完整、成熟的电气设计解决方案。作者&#xff1a;Eplan 王阳 | 来源&#xff1a;e-works一、汽车行业快速…