• [其他] 深度学习之万能系统
    万能近似定理意味着无论我们试图学习什么函数,我们知道一个大的 MLP 一定能够表示这个函数。然而,我们不能保证训练算法能够学得这个函数。即使 MLP能够表示该函数,学习也可能因两个不同的原因而失败。首先,用于训练的优化算法可能找不到用于期望函数的参数值。其次,训练算法可能由于过拟合而选择了错误的函数。回忆第 5.2.1 节中的 ‘‘没有免费的午餐’’ 定理,说明了没有普遍优越的机器学习算法。前馈网络提供了表示函数的万能系统,在这种意义上,给定一个函数,存在一个前馈网络能够近似该函数。不存在万能的过程既能够验证训练集上的特殊样本,又能够选择一个函数来扩展到训练集上没有的点。万能近似定理说明了,存在一个足够大的网络能够达到我们所希望的任意精度,但是定理并没有说这个网络有多大。Barron (1993) 提供了单层网络近似一大类函数所需大小的一些界。不幸的是,在最坏情况下,可能需要指数数量的隐藏单元(可能一个隐藏单元对应着一个需要区分的输入配置)。这在二进制情况下很容易看到:向量 v ∈ {0, 1}n 上的可能的二进制函数的数量是 22n,并且选择一个这样的函数需要2n 位,这通常需要 O(2n) 的自由度。
  • [其他] 深度学习之灾难遗忘
    每个 maxout 单元现在由 k 个权重向量来参数化,而不仅仅是一个,所以 maxout单元通常比整流线性单元需要更多的正则化。如果训练集很大并且每个单元的块数保持很低的话,它们可以在没有正则化的情况下工作得不错 (Cai et al., 2013)。maxout 单元还有一些其他的优点。在某些情况下,要求更少的参数可以获得一些统计和计算上的优点。具体来说,如果由 n 个不同的线性过滤器描述的特征可以在不损失信息的情况下,用每一组 k 个特征的最大值来概括的话,那么下一层可以获得 k 倍更少的权重数。因为每个单元由多个过滤器驱动,maxout 单元具有一些冗余来帮助它们抵抗一种被称为灾难遗忘(catastrophic forgetting)的现象,这个现象是说神经网络忘记了如何执行它们过去训练的任务 (Goodfellow et al., 2014a)。
  • [其他] 深度学习之整流线性单元及其扩展
    整流线性单元使用激活函数 g(z) = max{0, z}。整流线性单元易于优化,因为它们和线性单元非常类似。线性单元和整流线性单元的唯一区别在于整流线性单元在其一半的定义域上输出为零。这使得只要整流线性单元处于激活状态,它的导数都能保持较大。它的梯度不仅大而且一致。整流操作的二阶导数几乎处处为 0,并且在整流线性单元处于激活状态时,它的一阶导数处处为 1。这意味着相比于引入二阶效应的激活函数来说,它的梯度方向对于学习来说更加有用。整流线性单元通常作用于仿射变换之上:h = g(W⊤x + b).当初始化仿射变换的参数时,可以将 b 的所有元素设置成一个小的正值,例如 0.1。这使得整流线性单元很可能初始时就对训练集中的大多数输入呈现激活状态,并且允许导数通过。
  • [其他] 深度学习之隐藏单元
    隐藏单元的设计是一个非常活跃的研究领域,并且还没有许多明确的指导性理论原则。整流线性单元是隐藏单元极好的默认选择。许多其他类型的隐藏单元也是可用的。决定何时使用哪种类型的隐藏单元是困难的事(尽管整流线性单元通常是一个可接受的选择)。我们这里描述对于每种隐藏单元的一些基本直觉。这些直觉可以用来建议我们何时来尝试一些单元。通常不可能预先预测出哪种隐藏单元工作得最好。设计过程充满了试验和错误,先直觉认为某种隐藏单元可能表现良好,然后用它组成神经网络进行训练,最后用验证集来评估它的性能。这里列出的一些隐藏单元可能并不是在所有的输入点上都是可微的。例如,整流线性单元 g(z) = max{0, z} 在 z = 0 处不可微。这似乎使得 g 对于基于梯度的学习算法无效。在实践中,梯度下降对这些机器学习模型仍然表现得足够好。部分原因是神经网络训练算法通常不会达到代价函数的局部最小值,而是仅仅显著地减小它的值,如图 4.3所示。这些想法会在第八章中进一步描述。因为我们不再期望训练能够实际到达梯度为 0 的点,所以代价函数的最小值对应于梯度未定义的点是可以接受的。不可微的隐藏单元通常只在少数点上不可微。一般来说,函数 g(z) 具有左导数和右导数,左导数定义为紧邻在 z 左边的函数的斜率,右导数定义为紧邻在 z 右边的函数的斜率。只有当函数在 z 处的左导数和右导数都有定义并且相等时,函数在 z 点处才是可微的。神经网络中用到的函数通常对左导数和右导数都有定义。在g(z) = max{0, z} 的情况下,在 z = 0 处的左导数是 0,右导数是 1。神经网络训练的软件实现通常返回左导数或右导数的其中一个,而不是报告导数未定义或产生一个错误。这可以通过观察到在数字计算机上基于梯度的优化总是会受到数值误差的影响来启发式地给出理由。当一个函数被要求计算 g(0) 时,底层值真正为 0 是不太可能的。相对的,它可能是被舍入为 0 的一个小量 ϵ。在某些情况下,理论上有更好的理由,但这些通常对神经网络训练并不适用。重要的是,在实践中,我们可以放心地忽略下面描述的隐藏单元激活函数的不可微性。除非另有说明,大多数的隐藏单元都可以描述为接受输入向量 x,计算仿射变换 z = W⊤x + b,然后使用一个逐元素的非线性函数 g(z)。大多数隐藏单元的区别仅仅在于激活函数 g(z) 的形式。
  • [其他] AI分析心电图并诊断疾病
    AI分析心电图并诊断疾病以色列理工学院的研究人员开发了一个基于人工智能的新系统,该系统使用增强的神经网络分析心电图,并可以自动检测疾病。论文链接:https://www.pnas.org/content/118/24/e2020620118相关报道:https://medicalxpress.com/news/2021-07-clinically-viable-ai-based-tools-medicine.html材料:通过机器学习预测粘合属性东京大学工业科学研究所的研究人员开发了一种机器学习模型,该模型可根据单个组件的参数确定粘合和吸收材料的特性。这是首个可预测材料多个不同属性的机器学习模型。奇偶平价图显示预测值与计算值论文链接:https://iopscience.iop.org/article/10.35848/1882-0786/ac083b相关报道:https://phys.org/news/2021-07-bonding-bond-properties-machine.html
  • [其他] 中国创建的人工智能模型大大优于美国模型
    !(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202107/24/233139uay2lcrvjovlnko7.png)中国开发了一种自然语言处理 (NLP) 算法,其性能优于谷歌公司(Google)或非盈利人工智能公司OpenAI的现有产品。北京智源人工智能研究院(BAAI)创建了“悟道2.0”(WuDao 2.0)自然语言处理预训练模型。这个模型能够模仿口语、识别图像、生成信息消息,甚至是诗歌。该模型使用 1.75 万亿个参数进行训练。相比之下,直到最近都被认为是最通用和最先进的OpenAI公司的 GPT-3 自然语言处理模型,只使用了 1750 亿个参数。每个参数都是由机器训练模型改变和决定的。随着模型的训练,参数可以根据已积累的数据进行修改。模型训练中使用的参数越多,模型最后就越先进。另一方面,参数数量的增加会使训练过程变得更长、更昂贵,因为它要求极大的计算能力。例如,GPT-3自然语言处理模型是在 Microsoft Azure AI 超级计算机上训练的。GPT-3自然语言处理模型去年发布时,尚属首个专业宽泛的模型。自然语言处理是人工智能 (AI) 的重要应用领域,旨在发展计算机分析和自然语言合成。换句话说,主要任务是教机器理解文本或话语,并相应地正确生成文本或话语。自然语言处理的首批模型是专业性很强的:聊天机器人、语音助手等。但是在大量参数上训练的模型可以得到更广泛的应用。据 GPT-3自然语言处理模型的开发者称,该模型可用于解决“任何英语问题”。为了训练算法,收集了 570 GB 的文本数据集。GPT-3自然语言处理模型确实能够做到了以前的人工智能所无法做到的事情。例如,在2020 年夏天,GPT-3 生成了一篇关于思维活动和新主意产生方法的文章。事实证明,这篇文章非常合乎逻辑且有趣。今年早些时候,谷歌公司创建了自己的Google Switch Transformer预训练模型,已经使用1.6万亿个参数进行了训练。但中国模型仍然更先进。“悟道2.0”自然语言处理预训练模型在1.2TB的文本数据上进行了训练,而且既有英语,又有中文。此外,图像也作为初始数据加载到模型中。共有4.9TB的数据用于训练模型。这样,截至目前,中国“悟道2.0”自然语言处理预训练模型大大优于美国模型的研发产品,北京师范大学-香港浸会大学联合国际学院教授许粲昊告诉俄罗斯卫星通讯社:> “我们可以看到,‘悟道’模型的复杂程度基本可以达到美国谷歌模型的10倍左右,在这方面中国毫无疑问是暂时处于世界领先地位的。包括在图像识别领域,中国也在一些国际大赛上包揽了诸多奖项,名列前茅。另外,在人工智能领域最关键的是中国拥有庞大的数据量,在用于训练模型的基本效果方面成效显著”。中国制定了到2030年在人工智能领域取得领先地位的雄心勃勃的目标。在2017年发布的《下一代人工智能发展规划》说,到2030年,中国人工智能产业至少将积累1500亿美元。谷歌大中华区前总裁、风险投资人李开复曾多次承认,由于人工智能尤其是机器训练的现代发展原则是基于数据组的,中国具有重要的竞争优势。中国近15亿人口为数据组的积累和处理奠定了基础。廉价劳动力丰沛则为中国提供了另一个可能性:成为世界数据处理工厂。问题在于,零散数据本身对机器训练没有多大价值。它们需要先被做标记。例如,从可用的图像组中挑出带有猫的图片并相应地为它们打上记号。实际上,在20年前农民工在缝纫机上缝制衣服的同一栋厂房里,现在标记工正在工作。他们每天坐在电脑前12个小时,标记大量数据组,供人工智能系统后来在数据组上训练。这样,像在传统工业中一样,中国正在努力接通人工智能发展的供应链。但存在一定的困难。许粲昊说,在人工智能的一些基础领域,中国仍像过去一样远远落后于其主要竞争对手美国。> “以前在人工智能领域我们有两个最大的短板:一是硬件设施。因为人工智能的训练和推理需要非常强大的硬件支持,包括在半导体硬件设计制造方面,我国也仍然有很长的路要走;二是基础理论。比如现在人工智能的模型算法已经足够成熟,也做得非常好,但是能否取得下一个突破?基础理论突破又在哪里?这些都还是大家仍然在摸索的内容”。目前,美国在设备生产(芯片、微电路)和软件制造方面都处于领先地位。比如,Tensorflow、Pytourch等全球最大的开源机器学习平台都是由美国公司创建的。在其他相关领域,欧洲和日本公司保持领先地位。例如,在硅片上雕刻集成电路所必需的深紫外(EUV)光刻先进设备是由荷兰光刻机设备供应商阿斯麦(ASML Holding N.V.)以及日本佳能(Canon)公司和尼康(Nikon)公司制造的。美国意识到可能失去科技领先地位,开始为中国制造障碍。例如,他们限制向中国供应芯片、设备和技术。同时,随着算法和模型将向所谓的普遍人工智能发展,数据将逐渐失去其在人工智能发展中的重要性。> “目前来看,数据量仍然是非常关键的问题。因为人类所有的知识都是日积月累所得,如果没有足够的数据支撑,AI是无法进行下一步的。不过当拥有了一定的数据量后,AI是否能够自己生成一些新的东西,做一些自我推理,或者自己学习新知识,我想也是一种可能性。只是从中短期来看,数据量具有必要性。”事实上,这个过程已经开始了。“悟道2.0”自然语言处理模型确实是在庞大的数据组上训练的。但这样做是为了将来重新训练模型时不再需要大量新数据。科学家们正努力使人工智能越来越像人类智能,也就是说,它可以根据已经积累的数据组学习一些新东西,这些数据并不与当前任务100%相关,但可以推论出新问题的解决方案。从这个意义上说,发展基础能力以保持未来竞争力对中国来说的确是重要的。实际上,2017年出台《人工智能发展规划》恰好在这个方向上划定了重点。与美国的贸易和技术战再次证明了北京所选择路线的正确性。明显,依赖全球供应链实在是不安全的。在政治趋势的影响下,昨天的合作伙伴可能会突然变成对手,停止任何合作。中国的“十四五”规划恰好规定对基础科学进行大规模的投资。实际上,美国也明白这一点,并努力不让中国继续前进。过去,私有公司和投资是进步的主要推动力,那么现在政府资助也参与这件事情。美国总统乔·拜登已向国会提议把联邦研发总支出增加135亿美元。此外,根据《无尽前沿法案》(Endless Frontier Act) 改革国家科学基金会(NSF)的计划,美国准备在2025年之前再投入1000亿美元用于发展基础技术以对抗中国。另一个问题是,中国为发展科技不吝资金。为此目的计划在2025年前至少花费1.4万亿美元。中美之间的人工智能竞赛很可能会采用多种方法。现任美国人工智能安全委员会主席、谷歌及其母公司Alphabet的前首席执行官埃里克·施密特(Eric Emerson Schmidt)表示,为阻止中国科技能力的快速发展,并使美国在芯片制造领域至少领先中国两代,有必要继续限制对中国的芯片和其它高科技产品的供应。此外,需要放宽移民法以吸引来自世界各地的最优秀人才。人工智能安全委员会(NCSAI)向总统和国会提出的建议中甚至提出“加速”中国的“人才流失”过程,为中国专家创造有吸引力的条件。实际上,目前尚不清楚这将如何付诸实施。至少在特朗普时代,越来越多的中国专家无法忍受签证、行政和其它限制,越来越多地离开美国返回祖国。___
  • [其他] moxing.tensorflow是否包含整个TensorFlow,如何对生成的checkpoint进行本地Fine Tune
    问题现象使用MoXing训练模型,“global_step”放在Adam名称范围下,而非MoXing代码中没有Adam名称范围,如图所示。其中1为使用MoXing代码,2代表非MoXing代码。!(https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202107/25/0131023fc7lngqu8bdmlmb.png)处理方法Fine Tune就是用别人训练好的模型,加上自己的数据,来训练新的模型。相当于使用别人的模型的前几层,来提取浅层特征,然后在最后再落入我们自己的分类中。由于一般新训练模型准确率都会从很低的值开始慢慢上升,但是Fine Tune能够让我们在比较少的迭代次数之后得到一个比较好的效果。Fine Tune的好处在于不用完全重新训练模型,从而提高效率,在数据量不是很大的情况下,Fine Tune会是一个比较好的选择。moxing.tensorflow包含所有的接口,对TensorFlow做了优化,里面的实际接口还是TensorFlow的原生接口。当非MoXing代码中没有Adam名称范围时,需要修改非MoXing代码,在其中增加如下内容:> with tf.variable_scope("Adam"):
  • [技术干货] 昇腾CANN训练营第二期——实操视频记录——合集
    应用营第二周-MindX SDK安装及yolov3模型转换https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=141807应用营第三周-基于MindX SDK开发目标检测应用以及图像分类应用https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=141808模型营第一周-使用华为云Ascend910在MNIST上训练LeNet网络https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=141809
  • [执行问题] 训练过程中出现aicpu_timeout错误
    【功能模块】【操作步骤&问题现象】在执行训练脚本时,在训练一段时间后,出现aicpu timeout,然后是aicore exception,这是什么原因呢【截图信息】epoch: 2 step: 42, loss is 2.3892338epoch: 2 step: 43, loss is 2.2343023epoch: 2 step: 44, loss is 2.5863597epoch: 2 step: 45, loss is 2.366575epoch: 2 step: 46, loss is 2.3410535epoch: 2 step: 47, loss is 2.3839974epoch: 2 step: 48, loss is 2.2711763epoch: 2 step: 49, loss is 2.405273epoch: 2 step: 50, loss is 2.5029404epoch: 2 step: 51, loss is 2.4402695epoch: 2 step: 52, loss is 2.705537epoch: 2 step: 53, loss is 2.5480757epoch: 2 step: 54, loss is 2.3782806[ERROR] RUNTIME(26736)kernel task happen error, retCode=0x28, [aicpu timeout].[ERROR] RUNTIME(26736)aicpu kernel execute failed, device_id=0, stream_id=356, task_id=21634, fault so_name=libaicpu_kernels.so, fault kernel_name=GetNext, extend_info=.[ERROR] RUNTIME(26736)kernel task happen error, retCode=0x28, [aicpu timeout].[ERROR] RUNTIME(26736)aicpu kernel execute failed, device_id=0, stream_id=356, task_id=21682, fault so_name=libaicpu_kernels.so, fault kernel_name=RunCpuKernel, extend_info=.[ERROR] RUNTIME(26736)kernel task happen error, retCode=0x28, [aicpu timeout].[ERROR] RUNTIME(26736)aicpu kernel execute failed, device_id=0, stream_id=356, task_id=21723, fault so_name=libaicpu_kernels.so, fault kernel_name=RunCpuKernel, extend_info=.[ERROR] RUNTIME(26736)kernel task happen error, retCode=0x26, [aicore exception].[ERROR] RUNTIME(26736)aicore kernel execute failed, device_id=0, stream_id=356, task_id=21724, fault kernel_name=TransData_14820854412497691606_0__kernel0, func_name=TransData_14820854412497691606_0__kernel0[ERROR] RUNTIME(26736)kernel task happen error, retCode=0x26, [aicore exception].[ERROR] RUNTIME(26736)aicore kernel execute failed, device_id=0, stream_id=356, task_id=21725, fault kernel_name=Add_4991568575394397394_0__kernel0, func_name=Add_4991568575394397394_0__kernel0[ERROR] RUNTIME(26736)kernel task happen error, retCode=0x26, [aicore exception].[ERROR] RUNTIME(26736)aicore kernel execute failed, device_id=0, stream_id=356, task_id=21726, fault kernel_name=ReLU_11583457613551613350_0__kernel0, func_name=ReLU_11583457613551613350_0__kernel0[ERROR] RUNTIME(26736)kernel task happen error, retCode=0x26, [aicore exception].[ERROR] RUNTIME(26736)aicore kernel execute failed, device_id=0, stream_id=356, task_id=21727, fault kernel_name=PReLU_16206946492510430883_0__kernel0, func_name=PReLU_16206946492510430883_0__kernel0[ERROR] RUNTIME(26736)kernel task happen error, retCode=0x26, [aicore exception].[ERROR] RUNTIME(26736)aicore kernel execute failed, device_id=0, stream_id=356, task_id=21728, fault kernel_name=Assign_4055605317082974277_0__kernel0, func_name=Assign_4055605317082974277_0__kernel0【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] CANN训练营第二期作业提交记录
    华为云账号hw38939615 ---- 昇腾CANN训练营第二期开营仪式上课截图模型营第一课 模型营第一课作业楼层:https://bbs.huaweicloud.com/forum/forum.php?mod=redirect&goto=findpost&ptid=133193&pid=1232232&fromuid=452339 模型营第2课----卷积:我裂开了正题模型营第2课作业楼层:https://bbs.huaweicloud.com/forum/forum.php?mod=redirect&goto=findpost&ptid=113294&pid=1240569&fromuid=452339 模型营第三课:我好像见“鬼”了  模型营第三课作业楼层:https://bbs.huaweicloud.com/forum/forum.php?mod=redirect&goto=findpost&ptid=133193&pid=1250536&fromuid=452339 应用营第一课--MindX SDK 应用营第一课作业楼层:https://bbs.huaweicloud.com/forum/forum.php?mod=redirect&goto=findpost&ptid=133193&pid=1229829&fromuid=452339 应用营第2课--应用营第二课:和X一起冲上云霄 应用营第2课作业楼层:https://bbs.huaweicloud.com/forum/forum.php?mod=redirect&goto=findpost&ptid=113294&pid=1236846&fromuid=452339 应用第三课:《与X终极一战!》  应用第三课作业楼层:https://bbs.huaweicloud.com/forum/forum.php?mod=redirect&goto=findpost&ptid=133193&pid=1247841&fromuid=452339 分数统计应用营:作业提交三次,观看视频三次 3x5 + 3x5 = 30模型营:作业提交三次,观看视频三次 3x5 + 3x5 = 30
  • [其他] 分享ModelArts Notebook快速开源项目实战 — U2Net(2)
    四、训练官方提供的训练代码中数据的路径和我们的datasets有些区别,需要对训练脚本进行一些修改,建议使用jupyter notebook方便排除错误新建一个Pytorch-1.4的jupyter Notebook文件,名称可以为train.ipynbimport moxing as mox# 如果需要从OBS拷贝切分好的训练数据#mox.file.copy_parallel('obs://bucket-test-xxxx', '/home/ma-user/work/U-2-Net/datasets')INFO:root:Using MoXing-v1.17.3-43fbf97fINFO:root:Using OBS-Python-SDK-3.20.7import osimport torchimport torchvisionfrom torch.autograd import Variableimport torch.nn as nnimport torch.nn.functional as Ffrom torch.utils.data import Dataset, DataLoaderfrom torchvision import transforms, utilsimport torch.optim as optimimport torchvision.transforms as standard_transformsimport numpy as npimport globimport osfrom data_loader import Rescalefrom data_loader import RescaleTfrom data_loader import RandomCropfrom data_loader import ToTensorfrom data_loader import ToTensorLabfrom data_loader import SalObjDatasetfrom model import U2NETfrom model import U2NETP/home/ma-user/anaconda3/envs/PyTorch-1.4/lib/python3.7/site-packages/skimage/io/manage_plugins.py:23: UserWarning: Your installed pillow version is < 7.1.0. Several security issues (CVE-2020-11538, CVE-2020-10379, CVE-2020-10994, CVE-2020-10177) have been fixed in pillow 7.1.0 or higher. We recommend to upgrade this library.from .collection import imread_collection_wrapperbce_loss = nn.BCELoss(size_average=True)/home/ma-user/anaconda3/envs/PyTorch-1.4/lib/python3.7/site-packages/torch/nn/_reduction.py:43: UserWarning: size_average and reduce args will be deprecated, please use reduction='mean' instead.warnings.warn(warning.format(ret))def muti_bce_loss_fusion(d0, d1, d2, d3, d4, d5, d6, labels_v): loss0 = bce_loss(d0,labels_v) loss1 = bce_loss(d1,labels_v) loss2 = bce_loss(d2,labels_v) loss3 = bce_loss(d3,labels_v) loss4 = bce_loss(d4,labels_v) loss5 = bce_loss(d5,labels_v) loss6 = bce_loss(d6,labels_v) loss = loss0 + loss1 + loss2 + loss3 + loss4 + loss5 + loss6 print("l0: %3f, l1: %3f, l2: %3f, l3: %3f, l4: %3f, l5: %3f, l6: %3f\n"%(loss0.data.item(),loss1.data.item(),loss2.data.item(),loss3.data.item(),loss4.data.item(),loss5.data.item(),loss6.data.item())) return loss0, lossmodel_name = 'u2net' #'u2netp'data_dir = os.path.join(os.getcwd(), 'datasets', 'train' + os.sep)# tra_image_dir = os.path.join('DUTS', 'DUTS-TR', 'DUTS-TR', 'im_aug' + os.sep)# tra_label_dir = os.path.join('DUTS', 'DUTS-TR', 'DUTS-TR', 'gt_aug' + os.sep)image_ext = '.jpg'label_ext = '.png'model_dir = os.path.join(os.getcwd(), 'saved_models', model_name + os.sep)epoch_num = 100000batch_size_train = 24batch_size_val = 1train_num = 0val_num = 0tra_img_name_list = glob.glob(data_dir + '*' + image_ext)tra_lbl_name_list = []for img_path in tra_img_name_list: img_name = img_path.split(os.sep)[-1] aaa = img_name.split(".") bbb = aaa[0:-1] imidx = bbb[0] for i in range(1,len(bbb)): imidx = imidx + "." + bbb tra_lbl_name_list.append(data_dir + imidx + label_ext)print("---")print("train images: ", len(tra_img_name_list))print("train labels: ", len(tra_lbl_name_list))print("---")train_num = len(tra_img_name_list)---train images: 420train labels: 420---salobj_dataset = SalObjDataset( img_name_list=tra_img_name_list, lbl_name_list=tra_lbl_name_list, transform=transforms.Compose([ RescaleT(320), RandomCrop(288), ToTensorLab(flag=0)]))salobj_dataloader = DataLoader(salobj_dataset, batch_size=batch_size_train, shuffle=True, num_workers=1)# ------- 3. define model --------# define the netif(model_name=='u2net'): net = U2NET(3, 1)elif(model_name=='u2netp'): net = U2NETP(3,1)if torch.cuda.is_available(): net.cuda()# ------- 4. define optimizer --------print("---define optimizer...")optimizer = optim.Adam(net.parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)---define optimizer...# ------- 5. training process --------print("---start training...")ite_num = 0running_loss = 0.0running_tar_loss = 0.0ite_num4val = 0save_frq = 2000 # save the model every 2000 iterations---start training...for epoch in range(0, epoch_num): net.train() for i, data in enumerate(salobj_dataloader): ite_num = ite_num + 1 ite_num4val = ite_num4val + 1 inputs, labels = data['image'], data['label'] inputs = inputs.type(torch.FloatTensor) labels = labels.type(torch.FloatTensor) # wrap them in Variable if torch.cuda.is_available(): inputs_v, labels_v = Variable(inputs.cuda(), requires_grad=False), Variable(labels.cuda(), requires_grad=False) else: inputs_v, labels_v = Variable(inputs, requires_grad=False), Variable(labels, requires_grad=False) # y zero the parameter gradients optimizer.zero_grad() # forward + backward + optimize d0, d1, d2, d3, d4, d5, d6 = net(inputs_v) loss2, loss = muti_bce_loss_fusion(d0, d1, d2, d3, d4, d5, d6, labels_v) loss.backward() optimizer.step() # # print statistics running_loss += loss.data.item() running_tar_loss += loss2.data.item() # del temporary outputs and loss del d0, d1, d2, d3, d4, d5, d6, loss2, loss print("[epoch: %3d/%3d, batch: %5d/%5d, ite: %d] train loss: %3f, tar: %3f " % ( epoch + 1, epoch_num, (i + 1) * batch_size_train, train_num, ite_num, running_loss / ite_num4val, running_tar_loss / ite_num4val)) if ite_num % save_frq == 0: model_weight = model_dir + model_name+"_bce_itr_%d_train_%3f_tar_%3f.pth" % (ite_num, running_loss / ite_num4val, running_tar_loss / ite_num4val) torch.save(net.state_dict(), model_weight) mox.file.copy_parallel(model_weight, 'obs://bucket-xxxx/output/model_save/' + model_weight.split('/')[-1]) running_loss = 0.0 running_tar_loss = 0.0 net.train() # resume train ite_num4val = 0l0: 0.167562, l1: 0.153742, l2: 0.156246, l3: 0.163096, l4: 0.176632, l5: 0.197176, l6: 0.247590[epoch: 1/100000, batch: 24/ 420, ite: 500] train loss: 1.189413, tar: 0.159183 l0: 0.188048, l1: 0.179041, l2: 0.180086, l3: 0.187904, l4: 0.198345, l5: 0.218509, l6: 0.269199[epoch: 1/100000, batch: 48/ 420, ite: 501] train loss: 1.266652, tar: 0.168805 l0: 0.192491, l1: 0.187615, l2: 0.188043, l3: 0.197142, l4: 0.203571, l5: 0.222019, l6: 0.261745[epoch: 1/100000, batch: 72/ 420, ite: 502] train loss: 1.313146, tar: 0.174727 l0: 0.169403, l1: 0.155883, l2: 0.157974, l3: 0.164012, l4: 0.175975, l5: 0.195938, l6: 0.244896[epoch: 1/100000, batch: 96/ 420, ite: 503] train loss: 1.303333, tar: 0.173662 l0: 0.171904, l1: 0.157170, l2: 0.156688, l3: 0.162020, l4: 0.175565, l5: 0.200576, l6: 0.258133[epoch: 1/100000, batch: 120/ 420, ite: 504] train loss: 1.299787, tar: 0.173369 l0: 0.177398, l1: 0.166131, l2: 0.169089, l3: 0.176976, l4: 0.187039, l5: 0.205449, l6: 0.248036五、测试新建一个Pytorch-1.4的jupyter Notebook文件,名称可以为test.ipynbimport moxing as mox# 拷贝数据mox.file.copy_parallel('obs://bucket-xxxx/output/model_save/u2net.pth', '/home/ma-user/work/U-2-Net/saved_models/u2net/u2net.pth')import osimport sysfrom skimage import io, transformimport torchimport torchvisionfrom torch.autograd import Variableimport torch.nn as nnimport torch.nn.functional as Ffrom torch.utils.data import Dataset, DataLoaderfrom torchvision import transforms#, utils# import torch.optim as optimimport numpy as npfrom PIL import Imageimport globfrom data_loader import RescaleTfrom data_loader import ToTensorfrom data_loader import ToTensorLabfrom data_loader import SalObjDatasetfrom model import U2NET # full size version 173.6 MBfrom model import U2NETP # small version u2net 4.7 MB%matplotlib inlineimport matplotlib.pyplot as pltfrom matplotlib.pyplot import imshow# normalize the predicted SOD probability mapdef normPRED(d): ma = torch.max(d) mi = torch.min(d) dn = (d-mi)/(ma-mi) return dndef save_output(image_name,pred,d_dir, show=False): predict = pred predict = predict.squeeze() predict_np = predict.cpu().data.numpy() im = Image.fromarray(predict_np*255).convert('RGB') img_name = image_name.split(os.sep)[-1] image = io.imread(image_name) imo = im.resize((image.shape[1],image.shape[0]),resample=Image.BILINEAR) pb_np = np.array(imo) if show: show_on_notebook(image, im) aaa = img_name.split(".") bbb = aaa[0:-1] imidx = bbb[0] for i in range(1,len(bbb)): imidx = imidx + "." + bbb imo.save(d_dir+imidx+'.png') return im def show_on_notebook(image_original, pred): #此函数可以在notebook中展示模型的预测效果 plt.subplot(1,2,1) imshow(np.array(image_original)) plt.subplot(1,2,2) imshow(np.array(pred))# --------- 1. get image path and name ---------model_name='u2net'#u2netpimage_dir = os.path.join(os.getcwd(), 'datasets', 'test') #注意这里的test_data/original存放的是datasets/test中的原始图片,不包含gtprediction_dir = os.path.join(os.getcwd(), 'output', model_name + '_results' + os.sep)model_dir = os.path.join(os.getcwd(), 'saved_models', model_name, model_name + '.pth')img_name_list = glob.glob(os.path.join(os.getcwd(), 'datasets/test/*.jpg'))# print(img_name_list)# --------- 2. dataloader ---------#1. dataloadertest_salobj_dataset = SalObjDataset(img_name_list = img_name_list, lbl_name_list = [], transform=transforms.Compose([RescaleT(320), ToTensorLab(flag=0)]) )test_salobj_dataloader = DataLoader(test_salobj_dataset, batch_size=1, shuffle=False, num_workers=1)# --------- 3. model define ---------if(model_name=='u2net'): print("...load U2NET---173.6 MB") net = U2NET(3,1)elif(model_name=='u2netp'): print("...load U2NEP---4.7 MB") net = U2NETP(3,1)if torch.cuda.is_available(): net.load_state_dict(torch.load(model_dir)) net.cuda()else: net.load_state_dict(torch.load(model_dir, map_location='cpu'))net.eval()# --------- 4. inference for each image ---------for i_test, data_test in enumerate(test_salobj_dataloader):# print("inferencing:",img_name_list.split(os.sep)[-1]) inputs_test = data_test['image'] inputs_test = inputs_test.type(torch.FloatTensor) if torch.cuda.is_available(): inputs_test = Variable(inputs_test.cuda()) else: inputs_test = Variable(inputs_test) d1,d2,d3,d4,d5,d6,d7= net(inputs_test) # normalization pred = d1[:,0,:,:] pred = normPRED(pred) # save results to test_results folder if not os.path.exists(prediction_dir): os.makedirs(prediction_dir, exist_ok=True) save_output(img_name_list,pred,prediction_dir, show=True)# sys.exit(0) del d1,d2,d3,d4,d5,d6,d7转自,https://bbs.huaweicloud.com/blogs/286010
  • [其他] 分享ModelArts Notebook快速开源项目实战 — U2Net(1)
    ModelArts Notebook快速开源项目实战 — U2Net一、U2Net介绍U2Net是一个优秀的显著性目标检测算法,由Qin Xuebin等人发表在Pattern Recognition 2020期刊[Arxiv]。U2Net名称的来源在于其网络结构由两层嵌套的Unet结构,可以在不需要预训练骨干网络的情况下从零开始训练,拥有优异的表现。其网络结构如图1所示。图1. U2Net的主体框架是一个类似于U-Net的编解码结构,但是每一个block替换为新提出的残差U-block模块项目开源地址:https://github.com/xuebinqin/U-2-Net二、创建Notebook开发环境进入ModelArts控制台选择开发环境 -> Notebook -> 创建创建Notebook3.1 可以选择和任务相关的名称,方便管理;3.2 为了减少不必要的资源消耗,建议开启自动停止;3.3 U2Net所需的运行环境在公共镜像中已经包含,可以选择pytorch1.4-cuda10.1-cudnn7-ubuntu18.04;3.4 建议选择GPU类型,方便模型快速训练;3.5 选择立即创建 -> 提交,等待notebook创建完成后打开Notebook。  导入开源项目源码(git/手动上传)4.1 在Terminal使用git克隆远程仓库cd work # 注意:只有/home/ma-user/work目录及其子目录下的文件在Notebook实例关闭后会保存git clone https://github.com/xuebinqin/U-2-Net.git4.2 如果git速度较慢也可以从本地上传代码,直接将压缩包拖到左侧文件目录栏或者采用OBS上传。三、 数据准备下载训练数据APDrawing dataset使用Wget直接下载到Notebook,也可下载本地后再拖拽到Notebook中。wget https://cg.cs.tsinghua.edu.cn/people/~Yongjin/APDrawingDB.zipunzip APDrawingDB.zip注:如果数据集较大(>5GB)需要下载到其它目录(实例停止后会被删除),建议存放在OBS中,需要的时候随时拉取。#从OBS中拉取代码到指定目录sh-4.4$ source /home/ma-user/anaconda3/bin/activate PyTorch-1.4sh-4.4$ python>>> mox.file.copy_parallel('obs://bucket-xxxx/APDrawingDB', '/home/ma-user/work/APDrawingDB')切分训练数据数据集中./APDrawingDB/data/train中包含了420张训练图片,分辨率为512*1024,左侧为输入图像,右侧为对应的ground truth。我们需要将大图从中间切分为两个子图。2.1 在Notebook开发环境中新建一个Pytorch-1.4的jupyter Notebook文件,名称可以为split.ipynb,脚本将会在./APDrawingDB/data/train/split目录下生成840张子图,其中原始图像以.jpg结尾,gt图像以.png结尾,方便后续训练代码读取【test文件夹切分步骤同理】。from PIL import Imageimport ostrain_img_dir = os.path.join("./APDrawingDB/data/train")img_list = os.listdir(train_img_dir)for image in img_list: img_path = os.path.join(train_img_dir, image) if not os.path.isdir(img_path): img = Image.open(img_path) #print(img.size) save_img_dir = os.path.join(train_img_dir, 'split_train') if not os.path.exists(save_img_dir): os.mkdir(save_img_dir) save_img_path = os.path.join(save_img_dir, image) cropped_left = img.crop((0, 0, 512, 512)) # (left, upper, right, lower) cropped_right = img.crop((512, 0, 1024, 512)) # (left, upper, right, lower) cropped_left.save(save_img_path[:-3] + 'jpg') cropped_right.save(save_img_path)test_img_dir = os.path.join("./APDrawingDB/data/test")img_list = os.listdir(test_img_dir)for image in img_list: img_path = os.path.join(test_img_dir, image) if not os.path.isdir(img_path): img = Image.open(img_path) #print(img.size) save_img_dir = os.path.join(test_img_dir, 'split') if not os.path.exists(save_img_dir): os.mkdir(save_img_dir) save_img_path = os.path.join(save_img_dir, image) cropped_left = img.crop((0, 0, 512, 512)) # (left, upper, right, lower) cropped_right = img.crop((512, 0, 1024, 512)) # (left, upper, right, lower) cropped_left.save(save_img_path[:-3] + 'jpg') cropped_right.save(save_img_path)将切分好的数据按照如下层级结构整理出训练和测试所需的datasets文件夹datasets/├── test (70张切分图片,只包含原图)└── train (840张切分图片,包含420张原图及对应的gt)注:可以将切分好的数据集保存到OBS目录中,减少./work的磁盘空间占用。完整的U-2-Net项目结构如下所示:U-2-Net/├── .git├── LICENSE├── README.md├── pycache├── clipping_camera.jpg├── data_loader.py├── datasets├── figures├── gradio├── model├── requirements.txt├── saved_models├── setup_model_weights.py├── test_data├── u2net_human_seg_test.py├── u2net_portrait_demo.py├── u2net_portrait_test.py├── u2net_test.py└── u2net_train.py转自,https://bbs.huaweicloud.com/blogs/286010
  • [技术干货] 【跟着小Mi一起机器学习吧!】神经网络的学习(上)
    危险,危险,危险——好久不见,等你在这里见面~在经过前两期关于神经网络的简单介绍后,今天小Mi将进一步介绍神经网络的代价函数、前向传播和反向传播,废话不多说,我们开干吧~1 代价函数首先引入一些便于稍后讨论的新标记方法:假设神经网络的训练样本有m个,每个包含一组输入x和一组输出信号y,L表示神经网络层数,表示每层的neuron个数(表示输出层神经元个数),代表最后一层中处理单元的个数。将神经网络的分类定义为两种情况:二类分类和多类分类,二类分类:,表示哪一类;K类分类:,表示分到第类; 小Mi带大家回顾一下,逻辑回归问题中的代价函数为:在逻辑回归中,我们只有一个输出变量,又称标量(scalar),也只有一个因变量y,但是在神经网络中,可以有很多输出变量,我们的是一个维度为K的向量,并且训练集中的因变量也是同样维度的一个向量,因此代价函数会比逻辑回归更加复杂一些,为:  这个看起来复杂很多的代价函数背后的思想还是一样的,我们希望通过代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行特征,都会给出K个预测,基本上可以利用循环对每一行特征都预测K个不同结果,然后在利用循环在K个预测中选择可能性最高的一个,将其与y中的实际数据进行比较。正则化的那一项只是排除了每一层后,每一层的矩阵的和。最里层的循环循环所有的行(由层的激活单元数决定),循环i则循环所有的列,由该层(层)的激活单元数所决定。即:与真实值之间的距离为每个样本-每个类输出的加和,对参数进行regularization的bias项处理所有参数的平方和。2 反向传播算法之前小Mi在计算神经网络预测结果的时候采用了一种正向传播方法,需要从第一层开始正向一层一层进行计算,直到最后一层的。现在,为了计算代价函数的偏导数,我们需要采用一种反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。下面用一个例子来说明反向传播算法。假设我们的训练集只有一个样本,我们的神经网络是一个四层的神经网络,其中K=4,,L=4:前向传播算法:从最后一层的误差开始计算,误差是激活单元的预测与实际值之间的误差,,用来表示误差,则: 。利用这个误差值来计算前一层的误差:, 其中是S形函数的导数,。而则是权重导致的误差的和。下一步是继续计算第二层的误差: ,因为第一层是输入变量,不存在误差。我们有了所有的误差的表达式后,便可以计算代价函数的偏导数了,假设,即不做任何正则化处理时有: 值得注意的是,需要清楚地知道上面式子中上下标的含义:l代表目前所计算的是第几层。j 代表目前计算层中的激活单元的下标,也将是下一层的第j个输入变量的下标。i代表下一层中误差单元的下标,是受到权重矩阵中第i行影响的下一层中的误差单元的下标。如果我们考虑正则化处理,并且训练集是一个特征矩阵而非向量。在上面的特殊情况中,我们需要计算每一层的误差单元来计算代价函数的偏导数。在更为一般的情况中,我们同样需要计算每一层的误差单元,但是需要为整个训练集计算误差单元,此时的误差单元也是一个矩阵,可以用来表示这个误差矩阵。第l层的第i个激活单元受到第j个参数影响而导致的误差。我们的算法表示为:即首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差运用反向传播法计算出直至第二层的所有误差。在求出了之后,便可以计算代价函数的偏导数了,计算方法如下:  3 反向传播算法的直观理解在上一节中,我们介绍了反向传播算法,对很多人来说,当第一次看到这种算法时,第一印象通常是,啊,这个算法看起来好难,需要那么多繁杂的步骤,简直是太复杂了!实在不知道这些步骤,到底应该如何合在一起使用。就好像一个黑箱,里面充满了复杂的步骤。如果你对反向传播算法也有这种感受的话,实际上是很正常的。相比于线性回归算法和逻辑回归算法而言,从数学的角度上讲,反向传播算法并不是一个简洁的算法,而且常常会让人感觉并不是很清楚反向传播算法究竟究竟在做什么。当然啦,小Mi始终认为,practice makes perfect!多做一些编程练习可以帮助我们将这些复杂的步骤梳理梳理,从而可以更深一步地理解反向传播算法具体是如何实现的,最终可以独立使用这个算法。下面小Mi会帮助大家巩固反向传播的一些固定步骤,使大家有一个更加全面直观的感受,理解这些步骤究竟是在做什么,同时也可以证明,它至少还是一个合理且合格的算法。当然啦,可能最终大家还是会觉得反向传播依然很复杂,依然像一个黑箱,包含了太多复杂的步骤,甚至有点神奇,这也OK。下面我们再来仔细研究一下前向传播的原理:为了更好地理解反向传播,我们先看研究下前向传播的过程,这是一个包含2个输入单元的神经网络结构(当然啦,我们并没有把偏置单元算进去),然后第二层有2个隐藏单元,再下一层也有2个,不过最后只有一个输出单元。为了更好地说明前向传播,可以用不同的颜色来表示这个网络。在进行前向传播时,可能会有一些特性的样本,比如,将其传到输入层中,因此可以把它们表示为,它们时我们为输入层设置的值,对其进行前向传播传播到第一个隐藏层时,然后计算出,它们是输入单元的加权和,然后我们将sigmoid逻辑函数,还有sigmoid激活函数应用到z值上得到这些激活值,也就是,然后继续向前传播,计算出,应用sigmoid逻辑函数和激活函数得到,就这样以此类推,最终得到,它是网络中最后的输出值。进一步研究下计算过程,比如紫红色表示的隐藏单元,将其权值表示出来,也就是,红色线这边的权值是,蓝色线的则是,因此计算的方法就是:,这就是前向传播。事实上,后面我们会发现反向传播的过程和前向传播非常相似,只是这两个算法计算的方向不一样而已,在反向传播算法中是从右往左进行运算: 首先我们先看看代价函数,这个代价函数一般应用于只有一个输出单元的情况,如果不止一个输出单元,只需对它们进行求和即可;但如果只有一个输出单元,代价函数就会是这样,我们同一组样本中,同时使用了前向传播和反向传播,可以择出一组单独的样本进行研究分析,,由于只有一个输出单元,就是一个实数,可以忽略正则化,即,所以最后这个正则化项就没有了,观察括号中的这个求和项,会发现代价函数对应第i个训练样本,即代价函数对应的训练样本,是由式子:给出。所以第i个样本的代价函数扮演了一个类似方差的角色,可以直接写成:,近似地当成是神经网络输出值与实际值的方差,就像逻辑回归中会偏向于选择比较复杂的带对数形式的代价函数,但是为了可以把这个代价函数看作是某种方差函数,因此表示了预测样本值的准确程度,也就是网络的输出值,和实际观测值的接近程度。现在再看看反向传播的过程,简单来说反向传播就是在计算项,其实看作在第层第个单元中得到的激活项的“误差”,更正式地说,项实际上代价函数关于的偏导数,也就是计算出的z项的加权和或者说代价函数关于z项的偏导数,具体来说这个代价函数是一个关于标签y和神经网络中的输出值的函数,如果分析网络的内部,稍微改动下项,就可以影响神经网络的这些值,最终将改变代价函数的值。另外,对于输出层而言,比如我们假设等于,当我们对样本做前向传播和反向传播的时候,设,这是一个误差值,也就是y的实际值与预测值的差,就可以算出的值,然后对这些值进行反向传播,最后可以计算出前一层的这些项,也就是和,然后继续进行传播,最后计算出和,反向传播的计算过程和前向传播非常地相似,只是方向翻过来了。可以看一下是如何计算出的值的,可以先标出权重,紫红色的权重为,红色的权重为,然后再来看是怎么计算的:再举一个例子,的计算方式就是:。顺带一提,这些值都只关于隐藏单元,并不包括偏置单元,这个包不包括取决于对于反向传播的定义以及实现算法的方式,所以也可以用其他方法来计算包含偏置单元的值。偏置单位的输出总是“+1”,由于它们并不影响偏导数的计算,所以可以最后计算。好啦,今天小Mi的分享就到这啦,希望今天大家能对反向传播这个复杂的函数有一个更加深入的理解,虽然有点复杂,但是好算法不怕多,对不对!下期的话小Mi还会针对神经网络的整体结构以及案例运用进行介绍,我们下期再见~(挥手十分钟!)PS:身在南京的小Mi也心系河南,一直在心中为大家默默祈祷!胡辣汤挺住,风雨面前盐水鸭和你们一起扛!!!
  • [问题求助] 使用ms训练的模型精度达不到torch水平
    EnvironmentHardware Environment(Ascend/GPU/CPU):Uncomment only one /device <> line, hit enter to put that in a new line, and remove leading whitespaces from that line:/device ascendSoftware Environment:-- MindSpore version (source or binary):1.2.0-- Python version (e.g., Python 3.7.5):3.7.5-- OS platform and distribution (e.g., Linux Ubuntu 16.04):centos7.5-- GCC/Compiler version (if compiled from source):Describe the current behavior我使用ascend910分布式训练,但是训练出的模型,总是不能达到我的理想效果,表现为准确率比较低我将torch 训练的模型文件中的参数加载到我的ms代码中,最终的准确率非常好。这可以证明我的代码没有问题,只是训练不能得到理想参数ms和torch精度相差10%个点,我也不知道哪里有问题,是不是半精度训练的方式就是得不到最佳结果?Describe the expected behaviorms的训练出的模型精度和torch一样我感觉,既然我可以正常使用torch模型参数进行预测,我感觉就是训练的问题,且超参数应该同样适用,所以就感觉是ms和ascend这边的问题
  • [其他] 分享ModelArts模型评估诊断
    在训练模型后,用户往往需要通过测试数据集来评估新模型的泛化能力。通过验证测试数据集上的平均损失,可以评估模型对未知数据的预测能力。模型评价指标是评估模型泛化能力的标准,不同的指标往往会导致不同的评判结果。ModelArts模型评估/诊断功能针对不同类型模型的评估任务,提供相应的评估指标。在展示评估结果的同时,会根据不同的数据特征对模型进行详细的评估,获得每个数据特征对评估指标的敏感度,并给出优化建议。模型评估/诊断功能帮助用户可以全面了解模型对不同数据特征的适应性,使得模型调优可以做到有的放矢。当前模型评估功能覆盖图像分类、物体检测和图像语义分割三大场景,快来看看如何使用模型评估功能吧~图像分类图像分类评估指标说明指标名称子参数说明精度评估图像类别分布不同类别图片数量的统计值。混淆矩阵混淆矩阵可帮助您了解分类错误的出现位置召回率召回率,正确预测的正例数和实际正例总数的比值,这个值越大代表漏检的概率越小。计算公式R=TP/(TP+FN),即混淆矩阵中某一列预测正确的个数除以该列的样本和。精确率精确率,正确预测的正例数和预测正例总数的比值,这个值越大代表误检的概率越小。计算公式P=TP/(TP+FP),即混淆矩阵中某一行预测正确的个数除以该行的样本和。F1值精确率与召回率的调和均值。计算公式F1=2*P*R/(P+R),其中R为召回率,P为精确率。ROC 曲线ROC 曲线用于绘制采用不同分类阈值时的 TPR (真正例率,纵坐标)与 FPR(假正例率,横坐标),ROC曲线越接近左上角,该分类器的性能越好。敏感度分析不同特征范围下的准确率将图片根据特征值,如亮度、模糊度等划分为几个部分,分别测试几个部分的精度然后绘图。特征分布图片特征值的分布图。值敏感度展示不同类别数据在不同特征值范围内的F1值 ,用于判别模型对哪个特征范围内的图片效果较好。物体检测物体检测评估指标说明指标名称子参数说明精度评估图像类别分布数据集中不同类别的图像框个数统计。P-R曲线根据每种分类的置信度对样例进行排序,逐个把样例加入正例进行预测,算出此时的精准率和召回率。使用这一系列的精准率和召回率绘制的曲线,即是一个类别的P-R曲线。不同目标框交并比阈值下的mAP计算不同目标框交并比阈值下的mAP值,并绘制曲线,反馈mAP值最高的阈值。其中交并比阈值是用于NMS时过滤可能预测为同一物体的重叠框的阈值。不同置信度阈值下的F1值计算不同置信度阈值下的平均F1值,并绘制曲线,反馈F1值最高的阈值。误检分析从预测结果角度统计错误检测的结果,包含准确检测、类别误检、背景误检、位置偏差四种误检的错误类型,绘制成饼图,统计各类错误占错误检测的比例。从预测结果的角度出发,预测框与实际框的交并比大于0.5时,预测框与实际框类别不符,认为是类别误检;预测框与实际框的交并比大于0.1小于0.5,预测框与实际类别相符,认为是位置误检;预测框与实际框的交并比小于0.1,认为是背景误检。漏检分析从实际标签角度统计遗漏检测的结果,包含准确检测、类别误检、背景误检、位置偏差四种漏检的结果类型,绘制成饼图,统计各类错误占漏检错误的比例。从实际框的角度出发,实际框与预测框交并比大于0.5,实际框与预测框类别不符,认为是类别漏检;实际框与预测框的交并比大于0.1小于0.5,实际框与预测框类别相符,认为是位置漏检;实际框与所有预测类别相同的框交并比小于0.1,认为是背景漏检。敏感度分析不同特征范围下的准确率与图像分类相似,但可选更多和目标框相关的特征,如目标框的交叠程度,目标框的个数。特征分布与图像分类相似,但可选更多和目标框相关的特征,如目标框的交叠程度,目标框的个数。图像语义分割图像语义分割评估指标说明指标名称子参数说明精度评估图像类别分布数据集中不同类别的像素个数统计。交并比简称IoU,计算每一类预测结果与标签的交并比,表达了预测集合与标签集合的交并比,对各类别的值求平均获得的就是平均交并比。交并比计算公式如下所示。假设类别总数是k+1 类,pii 表示第i类分类正确的数量,pij 表示第i类被识别为第j类的数量。Dice系数取值范围为0-1,越接近1说明模型越好。Dice系数计算公式如下所示。假设类别总数是k+1 类,pii 表示第i类分类正确的数量,pij 表示第i类被识别为第j类的数量。调用模型评估接口了解评估结果ModelArts提供了“analyse”接口,用于模型评估。用户在推理结束后,传入指定参数调用该接口即可获取评估结果。analyse(task_type=’’,pred_list=[],label_list=[],name_list=[],custom_metric=’’,label_map_dict=’’)参数说明参数是否必选说明task_type是任务类型。支持“image_classification”或“image_object_detection”参数值。 “image_classification”表示图像分类。 “image_object_detection”表示物体检测。pred_list是模型预测输出列表。label_list是所有图片的标签列表。name_list是所有图片对应的OBS路径。此处需使用绝对路径。custom_metric否用户自定义的指标。label_map_dict否标签索引和名称。如果不设置,系统默认使用{“0”: “0”, “1”: “1”, “2”: “2”, …}作为展示标签。 示例:{“0”: “dog”, “1”: “cat”, “2”: “horse”}转自https://bbs.huaweicloud.com/blogs/280910
总条数:2772 到第
上滑加载中