ad

深度学习比赛中常见的一种手段:测试时增强(TTA)-英雄云拓展知识分享

匿名投稿 294 2024-02-01

【摘要】 前言 在很多深度学习的比赛项目中,各种方法trick层出不穷,其中有一种颇受争议的方法就是在测试时使用增强的手段,将输入的源图片生成多份分别送入模型,然后对所有的推理结果做一个综合整合。这种方法被称为测试时增强(test time augmentation, TTA),今天我们就来说说这个测试时增强。TTA流程 TTA的基本流程是通过对原图做增强操作,获得很多份增强后...

前言

       在很多深度学习的比赛项目中,各种方法trick层见叠出,其中有一种颇受争议的方法就是在测试时使用增强的手段,将输入的源time augmentation, TTA),今天我们就来讲说这个测试时增强。

TTA流程

       TTA的基本流程是经过对原style="text-align: center;">

这么看上去需要确认很多问题:

  1. 深度学习比赛中常见的一种手段:测试时增强(TTA)-英雄云拓展知识分享

  2. 生成的样本在获得推理结果以后应当使用甚么样的方法进行合成。

我们举个简单的例子来讲明TTA的作用和如何利用ModelArts平台提供的功能来使用TTA。

TTA使用实例

实验环境:

       数据集:在前一篇博客中,我有说明一种用于解决数据过少和不均衡现象的方法,一样我们也使用这个太阳能电板的数据集。数据集样例style="text-align: center;">

       其中左边为正常样本     使用框架及算法:pytorch官方提供的训练imagenet开源代码,参考https://github.com/pytorch/examples/tree/master/imagenet

       训练策略:50个epoch,初始学习率lr0.001,batchsize16用Adam的优化器训练。

原模型精度信息:

精度信息正常类有瑕疵非正常类
召回率recall97.2%71.3%
精度值accuracy89.13%

TTA进程:

  1. 首先,我们要选定使用的增强方法来获得多样本。这里有两类方法:

    (1).从训练中使用的增强手段入手,用训练中使用的增强手段获得多样本。

           如pytorch训练imagenet的代码中,使用了算子transforms.RandomHorizontalFlip()做垂直方向的翻转操作。那末对模型而言,应当也见过很多经过垂直翻转的      对原模型进行评估,评估代码以下,这里是修改了开源代码中validate部份做前向部份推理的代码:

    with torch.no_grad():    

            end = time.time()

            for i, (images, target) in enumerate(val_loader):

                if args.gpu is not None:

                    images = images.cuda(args.gpu, non_blocking=True)

                target = target.cuda(args.gpu, non_blocking=True)

    

                # compute output

                output_origin = model(images)

                output = output_origin

                loss = criterion(output, target)

                pred_list += output.cpu().numpy()[:, :2].tolist()

                target_list += target.cpu().numpy().tolist()

                # measure accuracy and record loss

                acc1, acc5 = accuracy(output, target, topk=(1, 5), i=i)

                losses.update(loss.item(), images.size(0))

                top1.update(acc1[0], images.size(0))

                top5.update(acc5[0], images.size(0))

    

                # measure elapsed time

                batch_time.update(time.time() - end)

                end = time.time()

    

                if i % args.print_freq == 0:

                    progress.display(i)

            # TODO: this should also be done with the ProgressMeter

            print(' * Acc@1 {top1.avg:.3f} Acc@5 {top5.avg:.3f}'

                  .format(top1=top1, top5=top5))

        name_list = val_loader.dataset.samples

        for idx in range(len(name_list)):

            name_list[idx] = name_list[idx][0]

        analyse(task_type='image_classification', save_path='./', pred_list=pred_list, label_list=target_list, name_list=name_list)

       评估就是需要取得3个list,推理的直接的结果logits组合成的pred_list,存储的是每张21.92235565185547]...[xxx, xxx]]。一个真实的label值组成的target_list,存储的是每张1, 0, 1, 1..., 1, 0]。还有原... xxx.jpg],这里是从pytorch度数据模块的类中经过val_loader.dataset.samples获得到后重新组合的。然后调用deep_moxing库中的analyse接口,在save_path下会生成一个model_analysis_results.json的文件,将这个文件上传到页面上任意一个训练任务的输出目录下,就可以在页面的评估界面上看到对模型评估的结果:

这结果中我们需要分析模型的敏感度:

接下来我们可以看看在pytorch中,如何加入TTA。

    pytorch的好处在于,可以直接获得到输入模型前的tensor并进行想要的操作。如在eval中

 with torch.no_grad():

        end = time.time()

        for i, (images, target) in enumerate(val_loader):

            if args.gpu is not None:

                images = images.cuda(args.gpu, non_blocking=True)

这里拿到的images就是已做好前处理的一个batch的class="brush:python;toolbar:false">def flip(x, dim):

    indices = [slice(None)] * x.dim()

    indices[dim] = torch.arange(x.size(dim) - 1, ⑴, ⑴,

                                dtype=torch.long, device=x.device)

    return x[tuple(indices)]

dim为模式,这里使用2为竖直方向的翻转,3为水平方向,1为做通道翻转。使用img_flip = flip(images, 2)就可以得到竖直方向翻转的class="brush:python;toolbar:false">img = images.numpy()

img[0] = cv2.blur(img[0], (3, 3))

images_blur = torch.from_numpy(img.copy())

3. 结果合成

   我们现在就得到了3个输出,原style="text-align: center;">

       先看flip_output,一个想法是,原训练中见过的做过翻转的style="text-align: center;">logits = 0.5*origin_result + 0.5*flip_result

       此时,模型的精度结果为:

操作accnorm类recallabnorm类recall
原版89.13%97.2%71.3%
flip结果合成87.74%
93.7%72.7%

       可以看到,虽然损耗了norm类的精度,但是相对而言更重要的指标abnorm类的recall有提升。

       然后分析blur_output,可以看到,位于最低的0⑵0%时,瑕疵类的精度是最高的,但是norm类的精度掉的太多,而且模糊本身就是提升abnorm类精度的,所以我们做一个折衷,一样取blurstyle="text-align: center;">logit = 0.5*origin_result + 0.5*blur_output

       此时,模型的精度结果为:

操作accnorm类recallabnorm类recall
原版89.13%97.2%71.3%
blur结果合成88.117%
94.8%73.3%

       可以看到,norm类的精度降落较多,abnorm类增长明显,与模型评估的分析结果一致。

       综上,我们调剂的结果虽然对norm类的损耗较多致使整体精度降落,但是这是符合模型分析的结果的,我们需要的指标就是abnorm类recall的提升,而且可以看到,模型评估的结果要稍好过使用原版增强的合成结果。

小结

       我们这里实验了两类使用test time augmatation的方法,一种是针对训练进程自带的增强方法来选择测试前增强,另外一种是经过对模型进行敏感度分析,分析


🌟 选择英雄云hpaPAAS 开启自动化、智能化企业转型未来 🌐       >>>>作为一款提供hpaPaaS平台服务的英雄云,有什么优势呢?面对数字化转型的挑战与机遇,选择一个适合自己企业的高度信息化、智能化和自动化的管理系统尤为重要。英雄云是一个值得考虑的选择。英雄云提供了一系列独特的优势,使其成为企业智能管理的首选。下面是英雄云的八大优势

1. 无需代码操作 💻

: 英雄云的平台无需编程知识,即可操作自定义的管理系统:ERP系统、CRM系统、进销存系统、人事行政OA系统、WMS系统等。这意味着用户无需拥有编程技能,也能轻松操控自己的系统。

2. 高度可定制性 🛠️

: 英雄云允许用户根据自己的业务需求、企业规模、成员人数、所需系统等等,进行高度定制服务;三大业务引擎:云表单(进阶版Excel)、工作流程(智能自动触发流程)以及仪表盘(可视化报表),帮助企业进行更简易的业务操作。

3. 减免重复工作 🔁

:无论是数据录入、审批流程还是报表生成,都可以轻松自动化,使员工能够专注于更有价值的任务。这种减免重复工作的方式不仅提高了工作效率,还降低了错误发生的可能性,为企业节省了时间和资源。

4. 生态系统集成 🌍

: 英雄云与其他常用企业应用和工具具有良好的生态系统集成能力,可以轻松集成与第三方系统,如财务软件、邮件服务等,实现全面的业务支持。

5. 数据分析与智能决策 📊

: 英雄云提供先进的数据分析工具如数据加工工厂,帮助用户更好地理解业务趋势和数据。这使得企业能够做出更明智的战略决策,优化业务流程。

6. 持续更新和改进

: 英雄云不断进行系统的更新和改进,以适应不断变化的业务环境和技术趋势。这意味着您始终能够使用最新的功能和性能提升。

7. 多样化部署 🌐

: 英雄云提供了多样化的部署选项,用户可以根据自身需求选择合适的部署方式,无需自主运维。无论是选择云端部署、私有云部署还是本地部署,英雄云都能提供灵活的解决方案。这意味着用户无需担心硬件维护、系统更新等问题,能够更专注于业务运营,降低了IT运营成本和风险。

8. 免费版本 💸

: 英雄云提供免费版本,用户可以在免费版本中获得一定数量的表单数据量和企业数据总量,为小型企业提供了经济实惠的选择。

选择英雄云作为您的数字化管理系统,将带来高度的灵活性、可定制性和效率提升。不管您的企业规模如何,英雄云都能满足您的需求,助力您的仓库管理更上一层楼。不妨注册一个英雄云账户,亲自体验这些优势,并让您的企业管理更加智能化和高效化


免责声明:

本网址(www.yingxiongyun.com)发布的材料主要源于独立创作和网友匿名投稿。此处提供的所有信息仅供参考之用。我们致力于提供准确且可信的信息,但不对材料的完整性或真实性作出任何保证。用户应自行验证相关信息的正确性,并对其决策承担全部责任。对于由于信息的错误、不准确或遗漏所造成的任何损失,本网址不承担任何法律责任。本网站所展示的所有内容,如文字、

上一篇:【国庆快乐】10一黄金周,“云端”畅玩攻略请查收!-英雄云拓展知识分享
下一篇:计算机网络发展的4个阶段-英雄云拓展知识分享
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×