怎么看内网是否稳定训练和测试的label是否稳定

登录以解锁更多InfoQ新功能
获取更新并接收通知
给您喜爱的内容点赞
关注您喜爱的编辑与同行
966,690 一月 独立访问用户
语言 & 开发
架构 & 设计
文化 & 方法
您目前处于:
Shift Left性能测试 – 不一样的测试方法
Shift Left性能测试 – 不一样的测试方法
Bernhard Klemm
0&他的粉丝
0&他的粉丝
日. 估计阅读时间:
:开启与Netflix、微软、ThoughtWorks等公司的技术创新之路!
亲爱的读者:我们最近添加了一些个人消息定制功能,您只需选择感兴趣的技术主题,即可获取重要资讯的。
相关厂商内容
相关赞助商
多用户性能测试通常发生于项目后期的原因有多种,根据项目的不同而不同。以下两个原因最为常见:
多用户性能测试要求工具和自动化。自动化性能测试脚本所需的资源只有在性能测试即将开始时才有望存在,即应用程序达到&稳定&的开发状态时。假如自动化一个性能测试脚本需要2天的话,那么拥有多个测试脚本(比如:10至20个)就要花费大量的时间或人力。为了不破坏当前在性能测试脚本开发上所花费的资源,该阶段不允许修改应用程序。所造成的结果就是:开发阶段的任何延迟或需要对代码进行大量的修改都将进一步延误性能测试,这给执行带来了风险,也不能及时提供相应价值。
多用户性能测试需要一个类产品环境。尤其是处于IT转型的项目,这样的环境不一定在项目初期就存在,需要时间、精力和金钱去构建。但与之竞争的是早期测试周期中所有其它必需的对测试环境的配置和那些&真正办事的&功能。对项目而言,绝对需要类产品环境的最早一刻是测试部署时(即彩排时刻)。而这时要想让性能测试对项目成果产生正面影响已为时过晚。
作为降低风险的活动,性能测试是绝对必要的。真正的挑战在于如何以不同方式进行,这样可以在有更多时间和预算时就能解决与性能相关的问题。性能测试应在测试生命周期内更频繁地被执行,同时与主要发布周期相互协调,从而提供更好的投资回报,并不断地帮助降低项目风险。
以下这些目标很可能与大部分IT转型项目的目标类似:
现代化 全球IT通过更新ERP和CRM应用程序到最新版本,为未来创新铺平了道路。
合理化 优化应用程序以降低成本和复杂性
集中化 集中化IT基础架构以降低成本和提高灵活性
本文所要说明的方法曾被一个处于IT转型的项目采用,该项目运行于一个中等规模企业,该企业在全球范围内运营,世界各地的办事处数量也在不断扩大。其通过标准的客户关系管理系统(CRM)和企业资源规划(ERP)应用程序, 在本地办公室内面对面地处理与客户的业务。
这两个应用程序的共同关键属性是显示大量数据给用户的同时,执行关键业务流程。此外,这些面向客户的业务流程还需要输入大量数据集(数百个记录/业务流程),然后在彼此上层处理。在以前使用大量数据集的测试业务流程往往只计划发生于用户验收测试(UAT)。其主要原因是:想在允许时间内覆盖所有必需测试集而手动输入数据的话,太费时间。数据迁移工作流被指定来为UAT传输这些数据,但是由于延迟,我们往往要等到UAT开始时才能期望用得上这些数据。
之前版本的CRM解决方案已经报告存在性能问题。当时该CRM已经集中化,并应用于世界各地的多个办公室。这些性能问题因地点而异,分布于不同的功能块;而且是由终端客户报告出来的,没有具体的测试或时间可供参考。
相反,之前的ERP解决方案是独立安装于各个地区或国家的,目前还没报告有性能问题。但是集中运行这两个应用程序的话,不由得让人担忧其性能,尤其在处理数据输入、扫描和打印等活动时。
可拓展性测试虽然是多用户性能测试的一个关键点,但却算不上该项目的关注点。以市场为导向的标准软件在实施时尽量地减少定制,并在产品环境中配置大小正好的基础设施服务器。
非功能性需求被定义为该项目的一部分,却需要被验证。该组织多年前曾购买过HP LoadRunner作为性能测试的首选工具。但由于预算的限制,后来并未在测试工具上做进一步的投资。
综合考虑各方面的限制和需求,该项目将以下这些定义为性能测试的主要目标:
度量 度量来自不同办公地点的应用程序的性能。
对比 与非功能需求的性能结果进行对比。
改进 为潜在的改进提供建议。
该解决方案从单一用户角度出发进行性能测试。对关键业务流程的测试将在数个月内以真实的、自动化的形式在世界各主要地点进行,同时还覆盖了各主要发布周期。现代可视化技术将显著地减少分析及诠释测试结果,还有呈现到项目管理团队的时间。该单一用户性能测试方法相比于&传统的&多用户性能测试有以下众多优点:
不需要类似产品一样的环境,可以使用任一现有测试环境。
其迭代方法允许性能测试脚本随着应用程序的发展而不断成熟,频繁的使用带来了良好的投资回报。与其冒着无法及时交付测试结果的极大风险而在短期内将大量预算花费在聘请众多性能测试脚本编写者上,这些费用大可以用于长期聘请一两位性能测试脚本编写者。
并非所有性能测试脚本都要同时准备好,并运行。
无需工作负载配置文件。
一旦类产品环境可用,自动化脚本可重用于多用户性能测试。
相比于手动测试,由于数据创建是自动的,单一用户性能测试可以在业务流程中使用更多更真实的数据量。
单一用户性能测试解决方案在执行时用到以下工具和方法:
资源上的限制决定了客户端的执行性能(比如:渲染时间)将不被考虑在内。这将通过在客户机上使用Profilers来完成(谷歌开发者工具),或将功能测试自动化工具结合类似WireShark等网络协议分析器。测试最初只专注于包括网络时间在内的服务器响应时间。
每个办公地点都会有两个用户配有已识别好的台式机,机器上装有HP的Load Generator软件。来自同一地点的两组测量数据保证了所收集数据的正确率。如果在任何时候两台机器针对相同活动所收集的数据都相差很多,我们就可以认为是本地用户设置出了问题。这不需要额外的硬件投资,也能从真实用户地点收集到响应时间测量值,因此特别真实。在该测试中所用到的脚本也能在多用户性能测试中复用,为性能测量提供统一、可重复的方法。不需要支付其它附加的测试工具许可证费用。
每个办公地点和数据中心的HP Load Generator分别以每15/1分钟频率执行性能测试脚本,确保我们不会稀里糊涂地陷入到执行多用户性能测试的陷阱中。其主要目的是将测试系统中的并发降到最低。从数据中心获取的测量数据扮演着&基准值&的角色,换句话说就是所谓的参考点。因此不同办公地点间的响应时间与&基准值&的不同可被假定为终端用户总体响应时间中与地点相关的那一部分,具体包括影响终端用户性能体验的网络延迟、路由、繁琐性及大小等等。&基准值&代表了服务器时间的具体值。根据测试环境的配置,从该测量数据中获取的结论可以用来判断是否存在与测试环境设置相关的问题。总体上的建议是测试环境应只水平地与产品环境版本进行缩放,而CPU速度、每个并发用户的内存及硬盘等输入输出速度应当与产品环境相当。这样我们就就可以很容易的假设&基准值&就是服务器的实际性能.
监测网络延迟(ICMP)和路由(tracert),并将其作为标准HPLoadRunner客户端吞吐量的一部分。这三个测量值的组合允许我们评估网络、路由和带宽限制的质量。
通过使用较低层的HP LoadRunner Web/HTML协议,应用程序的繁琐性将自动被记录,其影响也可评估出。而使用类似Ajax True Client协议这样较高层的HP LoadRunner协议,在检测繁琐度时则需要额外的精力和工具(比如:Wireshark或Google 开发者工具集)。
该整体SUPT方法可以通过使用其他性能测试或类似HP Business Availability Centre(HP BAC)这样的性能监控工具以类似的方法来执行。
为了收集有价值且有效的数据,我们在所有办公地点将所有性能测试脚本执行上一段足够长的时间。每个地点都使用两个Load Generator的策略让我们对测试结果更有自信,也帮助我们定位及解决用户在配置上的不同。
&基准值&允许我们在不同环境上执行测试,比如:系统集成、用户验收或预产品等环境,通过对比不同地点的响应时间及相应数据中心的响应时间,我们可以区分出特定性能问题来自应用程序,还是环境或地点。
但要想使之成为可能的先决条件是在数据中心每隔一分钟执行一遍性能测试脚本的循环。而其他所有地点则会每15分钟循环一遍(每个地点间交错开1分钟的间隔)。目的在于观察服务器和远程地点在执行相同流程时响应时间的不同,而不是让服务器超载。
一旦结果出来,我们要面对的挑战是如何尽快有效地分析这些数据并为以下内容提供信息和分析数据:
性能最差的地点。
性能最差的测试脚本(业务流程)。
针对非功能需求的性能(SLAs)。
可被网络管理团队定位的路由和网络延迟信息。
针对如何改进性能所提出的建议。
SUPT的结果是由每个地点每一个事务响应时间而组成的大数据表。我们选择第90百分位作为响应时间的代表值。
圆形可视化
我们所面临的挑战是找到能快速分析这些数据的工具。查看过各种各样可视化工具及技术之后,我遇到了Mike Bostoks的&D3&项目,从那找到了圆形可视化及Circos,从而发现完成这一工作的最佳工具。
&是将数据和信息可视化的软件包。它以圆形布局可视化数据,这使得Circos成为研究事务或地点间关系的理想工具,也是展示图表的理想工具。圆形布局除了美观外,还有其它的有利因素。&
有不少工具可让Circos更易于使用,Table Viewer tool就是其中一个,在网上就可以找到。
建议在Linux上下载并配置Circos。第一次分析时,最简单的方式是使用的Table Viewer tool的在线版本。
性能测试结果需导入到数据表中,其内容应与下图相似。数据表还需符合以下要求:
无重复事务名。对于所有业务流程中相同的业务,推荐使用&S01_xx&作为惯例(比如:S01_Login)。
事务或地点名中无空格。
将地点作为列(&A1&,&A2&等)
将HP LoadRunner事务名作为行(&da&,&db&等)。
将第一列重命名为&Label&。
尽量保持名字短小。
将文件分割符选为&Tab&。
单单使用Table Viewer默认在线配置就能生成令人惊喜的结果。用于在线生成图形的配置文件可以下载下来与本地安装一起使用。
所得到的结果是类似下图。理解该图像的关键是从12点钟开始,然后顺时针查看HP LoadRunner响应时间测量值;或者参考事务(小写字母),然后逆时针查看地点(大写字母)。地点所对应的厚度是该地点所有响应时间的总和。同时生成的柱状图对进一步分析也非常有用。仅通过视觉比较,我们一眼就可以看出哪些地点受到低性能的影响,以及相对应的特定流程和步骤。
由于事务的数量可以相当大,该图像在分析事务时信息量可能会有所减少。下一步我们需要过滤掉那些没有问题的响应时间。比如那些响应时间少于最低SLA(以5秒为例)的事务就可以被排除出去。使用Table Viewer工具的话,有两种方式可以达到这一目的。其中一种是过滤掉这些事务,但将其保留在总体计算中。
该图像确实突出了性能最差的事务,以及它们在总体业务流程性能上所占的百分比,同时它还为理解潜在的性能改进提供了基础。
要想在更紧凑且缩放的视图中查看相同信息的话,我们还可以将那些通过SLA的事务从总体计算中排除。
我们现在可以清楚地识别出&fa&、&ea&、&dz&和&da&事务的性能是最差的,而&A1&、&A2&和&A8&地点的性能最好,&A1&地点则是数据中心。
现在的目标是生成网络延迟和路由的相似视图。第一步我们需要用LoadGenerator将HP LoadRunner Analysis中的从源到目的地的路由所对应的总网络延迟信息分组(Analysis工具的一个功能)。然后将这些信息导出到电子表格中。
我们的目的在于验证网络延迟是否在预期的SLA范围之内。下图比较了网络延迟测量值和已知的从源到目的地的SLA临界值。为了了解是否有已知地点超出SLA,需要添加主机地点的信息。举个例子:如果HOST11位于欧洲,那么SLA就通过了,如果位于其它地方,则失败。
点击图片放大
同样每个地点的吞吐量也要与参考点进行对比,与地点的假定可用带宽及用于数据中心的实际带宽进行对比。数据中心地点的测量值将决定达到假定的接近无限带宽的可能最大值(比如:千兆以太网)。
点击图片放大
下一步目标是为网络管理团队获取更多的细节,我们尝试获取更多关于路由和网络延迟的详尽分解信息。该分析的基础是HP LoadRunner分析工具中的网络段延迟图(Network Segment Delay Graph)。
桑基图是有向图,其箭头线的大小代表了流量大小。桑基图被用于各种流程的可视化,不限于能源和材料,是任何&从&源&到&目的地的流程定义(实际或虚拟)。桑基图将我们的注意力带到了流量最大的流程上的同时,也显示了各个流程间的流量比例,指示了&从 - 到&的流动方向。桑基图是以爱尔兰工程师Captain Matthew Henry Phineas Riall Sankey()的名字命名的。(, en.wikipedia.org/wiki/Sankey_diagram, )
下图的创建使用了来自 的桑基图实例和从HPLoadRunnerAnalysis工具中提取的网络段延迟数据。
生成该图像的步骤如下:
下载D3noob实例文件到目录。
将从HP LoadRunner Analysis工具中导出的网络段延迟数据导入到电子表格中,然后将其拷贝到&data&子目录中的&Sankey.xls&。
确保网络延迟无零值,可以将0值设置为0.01或其它。
确保电子表格中的标题如下所示,并将其保存为&.csv&文件。
刷新本地URL就能看到如上图显示的图像。
网络可视化
桑基图用于理解单个网络路径和延迟时特别有效。但当试图显示整个网络时,d3noob实例的局限性就暴露出来了。而我们的需求是采用一个易于使用的工具将复杂的网络图可视化。可用的工具很多,尤其在社交网络分析这方面,NodeXL是最适合这一目的的工具。
&NodeXL是Microsoft& Excel&
和(可能)2013免费的开源模板,它使得网络图像探索变得轻松。有了NodeXL,我们可以在工作表中输入网络边缘列表,然后点击按钮查看图像,所有的内容都呈现在熟悉的Excel窗口里。&()
我们将所有网络延迟段信息输入到同一工具里,并期望它能帮助我们确定任意特定路由问题。NodeXL所带来的视图效果还有很多,在这里我们并没有全部采用(像节点图片等)。
性能良好的网络段通过基于标签的&动态过滤器(Dynamic Filter)& 可以简单地过滤掉。这种情况下,该标签是网络延迟的数值表征。我们还未探索的可能性是创建源到目的地网络延迟计算的交互总值。尽管它会是个有趣的功能,但并非是必须的。从之前的分析中,我们已经有了总的源到目的地的测量值。
为了调查正确的路由方向,可以将图像属性从未定向改成定向。
在该实例中,图中间的&diamond&看起来比较可疑。该工具有简单的缩放功能。
上图显示了部分通信从&E&跳转到&J&的两种路径,分别是&HH&和&II&。&II&路由的延迟要比&HH&路由高。该信息可以很容易地传递到网络管理团队,并用于项目内的沟通。我们期望网络团队能调查&diamond&存在的原因,并提供合适的解决方案。
通过上述步骤,我们对应用程序和地点性能的理解不再是个谜团,是时候开始专注关键的性能改进了。想要理解哪个改进是关键的,性能测试结果需要与非功能需求进行对比。这可以使用带有过滤功能的Circos或带有图像和表格的Excel可视化功能来完成。
下表显示了每个地点响应时间的分析总结。SLA列值是从表中检索出来的,用来确保SLA的简单管理,以防止任何变化。
点击图像放大
该总结图表可以如下蜘蛛网图来显示。
同样的方法也需要应用到网络延迟和吞吐量SLA的测量及比较。
现在我们所拥有的关键调查结果包括:
我们知道业务流程中哪些步骤有性能问题。
我们知道哪个地点有性能问题。
我们知道网络延迟和带宽测量值。
下一个步骤我们需要进一步深入获取有性能问题的业务流程详情。之前的步骤允许我们非常有效地走到这一步。
现在我们要做的是回答以下这些问题:
应用程序是否要下载多个静态对象?如果是,那么这些对象能否缓存到本地,从而避免网络下载?能否降低数量或将对象组合起来?
应用程序是否繁重,其繁重性是否随着数据处理量的增加而增加?在该示例中,应用程序可以按顺序针对每个事项在服务器中调用一个更新。如果只是手动测试中的10个事项则完全没有问题,但如果是在SUPT时使用的真实数据量达到500至1000个事项的话,对性能将会有显著的影响。
应用程序是否要下载或上传大型对象,比如:文档、图像等?扫描仪的设置会极大地增加扫描文件的大小,却不会显著地提高其质量。检测扫描文件的大小会明显地影响上传和下载时间。另外,带宽也会随之大幅度地增加。
总的说来,该单用户性能测试方法的目的在于通过在全球不同内部地点内对真实数据量的使用,从而让我们对应用程序性能能有个早期的概念。使用适当的现代可视化工具能帮助我们快速地分析与性能相关的数据,并定位性能问题。对上述方法和工具的使用也确保了其结果能在项目中传递的同时,被技术或非技术人员理解。
Bernhard Klemm在IT行业拥有超过16年的工作经验,他曾在不同行业中从事过开发人员、架构师、性能调优专家、项目/程序经理、客户经理和测试(项目)经理等职位。可以通过或联系到他。
查看英文原文:
Author Contacted
语言 & 开发
232 他的粉丝
文化 & 方法
83 他的粉丝
0 他的粉丝
Performance
1 他的粉丝
0 他的粉丝
0 他的粉丝
21 他的粉丝
1 他的粉丝
告诉我们您的想法
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
赞助商链接
InfoQ每周精要
订阅InfoQ每周精要,加入拥有25万多名资深开发者的庞大技术社区。
架构 & 设计
文化 & 方法
InfoQ.com及所有内容,版权所有 ©
C4Media Inc. InfoQ.com 服务器由 提供, 我们最信赖的ISP伙伴。
极客邦控股(北京)有限公司
找回密码....
InfoQ账号使用的E-mail
关注你最喜爱的话题和作者
快速浏览网站内你所感兴趣话题的精选内容。
内容自由定制
选择想要阅读的主题和喜爱的作者定制自己的新闻源。
设置通知机制以获取内容更新对您而言是否重要
注意:如果要修改您的邮箱,我们将会发送确认邮件到您原来的邮箱。
使用现有的公司名称
修改公司名称为:
公司性质:
使用现有的公司性质
修改公司性质为:
使用现有的公司规模
修改公司规模为:
使用现在的国家
使用现在的省份
Subscribe to our newsletter?
Subscribe to our industry email notices?
我们发现您在使用ad blocker。
我们理解您使用ad blocker的初衷,但为了保证InfoQ能够继续以免费方式为您服务,我们需要您的支持。InfoQ绝不会在未经您许可的情况下将您的数据提供给第三方。我们仅将其用于向读者发送相关广告内容。请您将InfoQ添加至白名单,感谢您的理解与支持。47被浏览3,494分享邀请回答12 条评论分享收藏感谢收起1添加评论分享收藏感谢收起1742人阅读
C++(107)
看过几篇博客和官网的介绍,总结出自己切实可行的pipline,思路如下:
第一:下载官网源码,训练测试,检测测试,如果没有问题,进行下一步。
第二:开始做满足其训练的数据,包括图像和带有标注的标准xml格式文件,这一步耗时微长一些,用到了 一下三个工具:
& & & & & & 1、P图工具
& & & & & & 2、生成xml文件工具
& & 3、转换图像格式工具
第三:数据替换
& & 1、将VOCdevkit/VOC2007中的JPEGImages和Annotations替换为以上生成数据
& & 2、生成训练所需train.txt和val.txt文件,使用工具create_list.py
& & & & & & 3、生成训练所需的标注txt文件,使用工具voc_label_change.py
& & 4、将上一步生成的众多txt文件放入VOCdevkit/VOC2007/labels中
第四:修改配置文件 和源码
& 1、cfg/voc.data文件中:class改成1;names=data/voc.names中的内容修改成自己所训练目标物的名字,该参数用于检测出目标物体后显示其类别时用;
& 2、cfg/yolo_voc.cfg文件中:region层classes改成1;region层上方第一个convolution层的fileters改成(classes+coords+1)*NUM,即(1+4+1)*5=30,所以把filters改成30。
& 3、src/yolo.c文件中:char *voc_names的类别,改成自己的类别名字,例如&char *voc_names={“person”};draw_detection这个函数的最后一个参数改成自己所训练的类别数,比如1;demo函数中倒数第三个参数从20改成1。
& 4、src/detector里面的路径,可选择性修改。
第五:训练:./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23,最后参数保存在backup中。
第六:测试:./darknet detector test cfg/voc.data cfg/yolo-voc.cfg yolo_voc_final.weights test/*.jpg -thresh 0.08
经过漫长的训练过程,model终于训练好了,为了评估性能,可以使用以下指令&
./darknet detector recall cfg/voc.data cfg/yolo_voc.cfg backup/yolo_voc_final.weights
需要注意的是,在使用这个指令之前,我先修改一下src/detector.c 这一函数
位置第375行改成:list *plist = get_paths(“/home/yolo_v2_tinydarknet/darknet/infrared/infrared_val.txt”);//改成infrared_val.txt的完整路径运行上面的指令会调用validate_detector_recall函数,这个函数中有个参数thresh(阈值),默认的值是.001,这个默认值设的很小,会让系统识别出更多的框来,导致proposals值激增,还会让recall值变高,达到98.5%。最终我改成了 .25。上面的函数只会显示出recall值,没有precision值,precision的值计算方法是:识别为正确的个数/画了多少个框,所以修改代码。把第447行显示结果的代码修改为 :
fprintf(stderr, &ID:%5d Correct:%5d Total:%5d\tRPs/Img: %.2f\tIOU: %.2f%%\tRecall:%.2f%%\t&, i, correct, total, (float)proposals/(i+1), avg_iou*100/total, 100.*correct/total);
fprintf(stderr, &proposals:%5d\tPrecision:%.2f%%\n&,proposals,100.*correct/(float)proposals); 12
运行后显示的结果是:&
ID: 101 Correct: 106 Total: 111 RPs/Img: 1.07 IOU: 82.00% Recall:95.50% proposals: 109 Precision:97.25%&
ID: 102 Correct: 107 Total: 112 RPs/Img: 1.07 IOU: 82.11% Recall:95.54% proposals: 110 Precision:97.27%
结果中的参数,理解:
Correct&:可以理解为正确地画了多少个框,遍历每张图片的Ground Truth,网络会预测出很多的框,对每一Groud Truth框与所有预测出的框计算IoU,在所有IoU中找一个最大值,如果最大值超过一个预设的阈值,则correct加一。
Total:一共有多少个Groud Truth框。
Rps/img:p 代表proposals, r 代表region。 意思就是平均下来每个图片会有预测出多少个框。预测框的决定条件是,预测某一类的概率大于阈值。在validation_yolo_recall函数中,默认的这一个阈值是0.001,这一阈值设置的比较低,这就会导致会预测出很多个框,但是这样做是可以提升recall的值,一般yolo用于画框的默认值是.25,使用这个阈值会让画出来的框比较准确。而validation_yolo_recall使用的阈值改成。25的时候,Rps/img
值会降低,recall的值会降低,所以validation_yolo_recall默认使用一个较低的阈值,有可能作者的目的就是为了提高recall值,想在某种程度上体现网络的识别精度比较高。
IoU、Recall、Precision:解释起来比较麻烦,请看我的博客有详细说明:&
访问:263983次
积分:5021
排名:第6646名
原创:225篇
转载:167篇
评论:71条
(3)(11)(10)(11)(12)(14)(3)(5)(26)(9)(12)(12)(14)(6)(22)(9)(6)(18)(31)(32)(1)(1)(6)(2)(1)(11)(1)(31)(1)(6)(1)(1)(17)(19)(2)(20)(6)3444人阅读
caffe(10)
最近开始学习caffe,最开始应该是因为自己急功近利,想直接用caffe模型达到自己的目的,感觉有点无从下手。现在不得不踏实下来,扎实的一步步学习。看了大牛徐其华系列教程,收获颇丰。在这里记录下自己学习训练和测试模型的过程,可以说相关知识是完全来自,只是记录一下自己实践中的问题和感悟。
在这里,再次对乐于分享的博主徐其华表示衷心的感谢,谢谢^_^!
原文如下(有更改):
一、准备数据
有条件的同学,可以去imagenet的官网,下载imagenet图片来训练。但是我没有下载,一个原因是注册账号的时候,验证码始终出不来(听说是google网站的验证码,而我是上不了google的)。第二个原因是数据太大了。。。
我去网上找了一些其它的图片来代替,共有500张图片,分为大巴车、恐龙、大象、鲜花和马五个类,每个类100张。需要的同学,可到我的网盘下载:
编号分别以3,4,5,6,7开头,各为一类。我从其中每类选出20张作为测试,其余80张作为训练。因此最终训练图片400张,测试图片100张,共5类。我将图片放在caffe根目录下的data文件夹下面。即训练图片目录:data/re/train/& ,测试图片目录: data/re/test/
二、转换为lmdb格式
首先,在examples下面创建一个myfile的文件夹,来用存放配置文件和脚本文件。然后编写一个脚本create_filelist.sh,用来生成train.txt和test.txt清单文件
# sudo mkdir examples/myfile
# sudo vi examples/myfile/create_filelist.sh
编辑此文件,写入如下代码,并保存
#!/usr/bin/env sh
DATA=data/re/
MY=examples/myfile
echo "Creating train.txt..."
rm -rf $MY/train.txt
for i in 3 4 5 6 7
find $DATA/train -name $i*.jpg | cut -d '/' -f4-5 | sed "s/$/ $i/"&&$MY/train.txt
echo "Done."
echo "Creating test.txt..."
rm -rf $MY/test.txt
for i in 3 4 5 6 7
find $DATA/test -name $i*.jpg | cut -d '/' -f4-5 | sed "s/$/ $i/"&&$MY/test.txt
echo "All done."
然后,运行此脚本(注意是在caffe根目录下)
sh examples/myfile/create_filelist.sh
成功的话,就会在examples/myfile/ 文件夹下生成train.txt和test.txt两个文本文件,里面就是图片的列表清单。
接着再编写一个脚本文件,调用convert_imageset命令来转换数据格式。
# sudo vi examples/myfile/create_lmdb.sh
#!/usr/bin/env sh
MY=examples/myfile
echo "Creating train lmdb..."
rm -rf $MY/img_train_lmdb
build/tools/convert_imageset \
--shuffle \
--resize_height=256 \
--resize_width=256 \
/home/gph/Desktop/caffe_cmake/caffe-master/data/re/ \
$MY/train.txt \
$MY/img_train_lmdb
echo "Done."
echo "Creating test lmdb.."
rm -rf $MY/img_test_lmdb
build/tools/convert_imageset \
--shuffle \
--resize_width=256 \
--resize_height=256 \
/home/gph/Desktop/caffe_cmake/caffe-master/data/re/ \
$MY/test.txt \
$MY/img_test_lmdb
echo "All Done."
因为图片大小不一,因此我统一转换成256*256大小。运行成功后,会在
examples/myfile下面生成两个文件夹img_train_lmdb和img_test_lmdb,分别用于保存图片转换后的lmdb文件。
三、计算均值并保存
图片减去均值再训练,会提高训练速度和精度。因此,一般都会有这个操作。
caffe程序提供了一个计算均值的文件compute_image_mean.cpp,我们直接使用就可以了
# sudo build/tools/compute_image_mean examples/myfile/img_train_lmdb examples/myfile/mean.binaryproto
compute_image_mean带两个参数,第一个参数是lmdb训练数据位置,第二个参数设定均值文件的名字及保存路径。 运行成功后,会在
examples/myfile/ 下面生成一个mean.binaryproto的均值文件。
四、创建模型并编写配置文件
模型就用程序自带的caffenet模型,位置在 models/bvlc_reference_caffenet/文件夹下,
将需要的两个配置文件,复制到myfile文件夹内
# sudo cp models/bvlc_reference_caffenet/solver.prototxt examples/myfile/
# sudo cp models/bvlc_reference_caffenet/train_val.prototxt examples/myfile/
修改其中的solver.prototxt
# sudo vi examples/myfile/solver.prototxt
net: "examples/myfile/train_val.prototxt"
test_iter: 2
test_interval: 50
base_lr: 0.001
lr_policy: "step"
gamma: 0.1
stepsize: 100
display: 20
max_iter: 500
momentum: 0.9
weight_decay: 0.005
solver_mode: GPU
snapshot: 200
snapshot_prefix: "examples/myfile/minemodel"
100个测试数据,batch_size为50,因此test_iter设置为2,就能全cover了。在训练过程中,调整学习率,逐步变小。
修改train_val.protxt,只需要修改两个阶段的data层就可以了,其它可以不用管。
name: "data"
type: "Data"
top: "data"
top: "label"
phase: TRAIN
mirror: true
crop_size: 227
mean_file: "examples/myfile/mean.binaryproto"
source: "examples/myfile/img_train_lmdb"
batch_size: 256
backend: LMDB
name: "data"
type: "Data"
top: "data"
top: "label"
phase: TEST
mirror: false
crop_size: 227
mean_file: "examples/myfile/mean.binaryproto"
source: "examples/myfile/img_test_lmdb"
batch_size: 50
backend: LMDB
实际上就是修改两个data layer的mean_file和source这两个地方,其它都没有变化 。
五、训练和测试
如果前面都没有问题,数据准备好了,配置文件也配置好了,这一步就比较简单了。
# sudo build/tools/caffe train -solver examples/myfile/solver.prototxt
运行时间和最后的精确度,会根据机器配置,参数设置的不同而不同。我的是gpu+cudnn运行500次,大约8分钟,精度为95%。
遇到的问题:
一、GPU显存不够
按照楼主的设置跑的话,很有可能会出现如下错误:
Check failed: error == cudaSuccess (2 vs. 0) out of memory
这就是显存不够的原因。修改train_val.prototxt中train层和test层中的batch_size为1(最小了,也可以适当改大点看看极限。楼主先是50不行,改成1了,写博客实验时发现改成50又行了。。。很是奇怪),对应的solver.prototxt中的test_iter改为100,进行测试。
二、没有.caffemodel模型出来
原博客solver.prototxt末尾将
snapshot: 200
snapshot_prefix: "examples/myfile/minemodel"
这两句话删除了,就不会生成训练好的模型。加上这两句,就会再examples/myfile/路径下生成minemodel_iter_200.caffemodel,minemodel_iter_200.solverstate等一系列文件。这两句话的作用就很明显了。
三、正确率
博主进行了多次实验,结果如下:
batch_size 4:
I1027 08:55:05.108747
3620 solver.cpp:317] Iteration 500, loss = 1.07896
I1027 08:55:05.108803
3620 solver.cpp:337] Iteration 500, Testing net (#0)
I1027 08:55:06.499388
3620 solver.cpp:404]
Test net output #0: accuracy = 0.66
I1027 08:55:06.499451
3620 solver.cpp:404]
Test net output #1: loss = 0.878872 (* 1 = 0.878872 loss)
I1027 08:55:06.499477
3620 solver.cpp:322] Optimization Done.
I1027 08:55:06.499495
3620 caffe.cpp:254] Optimization Done.
batch_size 25:
I1027 09:10:17.994113
3691 solver.cpp:317] Iteration 500, loss = 0.213029
I1027 09:10:17.994165
3691 solver.cpp:337] Iteration 500, Testing net (#0)
I1027 09:10:18.840204
3691 solver.cpp:404]
Test net output #0: accuracy = 0.92
I1027 09:10:18.840255
3691 solver.cpp:404]
Test net output #1: loss = 0.226978 (* 1 = 0.226978 loss)
I1027 09:10:18.840271
3691 solver.cpp:322] Optimization Done.
I1027 09:10:18.840282
3691 caffe.cpp:254] Optimization Done.
batch_size 40:
I1027 09:25:46.159993
3747 solver.cpp:317] Iteration 500, loss = 0.0773205
I1027 09:25:46.160049
3747 solver.cpp:337] Iteration 500, Testing net (#0)
I1027 09:25:47.182668
3747 solver.cpp:404]
Test net output #0: accuracy = 0.933333
I1027 09:25:47.182724
3747 solver.cpp:404]
Test net output #1: loss = 0.216487 (* 1 = 0.216487 loss)
I1027 09:25:47.182741
3747 solver.cpp:322] Optimization Done.
I1027 09:25:47.182752
3747 caffe.cpp:254] Optimization Done.
batch_size 50:
I1027 11:02:35.578799
6155 solver.cpp:317] Iteration 500, loss = 0.11367
I1027 11:02:35.578866
6155 solver.cpp:337] Iteration 500, Testing net (#0)
I1027 11:02:36.411149
6155 solver.cpp:404]
Test net output #0: accuracy = 0.95
I1027 11:02:36.411223
6155 solver.cpp:404]
Test net output #1: loss = 0.176876 (* 1 = 0.176876 loss)
I1027 11:02:36.411248
6155 solver.cpp:322] Optimization Done.
I1027 11:02:36.411267
6155 caffe.cpp:254] Optimization Done.
这里我明白了caffe学习之路任长道远啊。
访问:144917次
积分:1792
排名:千里之外
原创:43篇
评论:65条
(2)(1)(3)(6)(2)(1)(2)(2)(5)(13)(5)(6)}

我要回帖

更多关于 furmark怎么看稳定性 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信