• [API使用] 【mindspore】【stop_gradient】停止梯度是不是向下递归的
    【功能模块】在文档中我看到有描述 mindspore.ops.stop_gradient,但是不清楚的是,这个API是不是向下截断梯度流的,例如我在模型最后计算 hidden_states 的时候加上一句 hidden_states = stop_gradient(hidden_states),那么它会截断整个模型的梯度计算吗?还是说只会截断最后一次 hidden_states 的计算。    具体而言可以通过一下简单的例子说明,如果我想要保持 EmbedLayer 可学习,而 AttentionLayer 不可学习,那么在构造 Net() 类的时候 stop_gradient 可以这么用么?会不会因为后层已经设置了stop_gradient ,它会禁止梯度向前传递,导致前层的EmbedLayer 实际也不可学习。    class EmbedLayer(nn.Cell): def __init__(self): pass def construct(self, x): passclass AttentionLayer(nn.Cell): def __init__(self): pass def construct(self, x): passclass Net(nn.Cell): def __init__(self): super(Net, self).__init__() self.attn = AttentionLayer() self.embed = EmbedLayer() def construct(self, x): out = self.embed(x) for i in range(16): out = self.attn(x) out = stop_gradient(out) return out
  • [安装] 【mindspore-gpu】【gpu训练】ubuntu终端自动退出
    【环境】Ubuntu22.04+mindspore-gpu1.7.0+cuda11.1+cudnn8.0.5【操作步骤&问题现象】1、正确配置显卡驱动和安装cuda,自己写了个一个用GPU训练的测试程序,没有问题。2、运行我自己写得网络的时候,数据处理部分没有问题,到训练那一步的时候突然终端会关闭掉。用pycharm的时候是pycharm会关闭掉。3、没有报错,终端和pycharm直接就关掉了,请问有人遇到过同类问题吗?
  • [问题求助] ModelArts训练bert模型错误:The list of path names matching the patterns
    【操作步骤&问题现象】我正在ModelArts平台上使用MindSpore版本的bert模型进行训练,但在上传workspace过程中遇到了这样的错误ValueError: The list of path names matching the patterns is empty.请问这是什么问题,又该如何解决呢,望高人解答【截图信息】这是我的参数配置:【日志信息】(可选,上传日志内容或者附件)
  • [其他] 浅谈决策树学习
    统计学,数据挖掘和机器学习中的决策树训练,使用决策树作为预测模型来预测样本的类标。这种决策树也称作分类树或回归树。在这些树的结构里,叶子节点给出类标而内部节点代表某个属性。在决策分析中,一棵决策树可以明确地表达决策的过程。在数据挖掘中,一棵决策树表达的是数据而不是决策。决策树的类型在数据挖掘中,决策树主要有两种类型:    分类树的输出是样本的类标。    回归树的输出是一个实数 (例如房子的价格,病人待在医院的时间等)。术语分类和回归树 (CART) 包含了上述两种决策树, 最先由Breiman 等提出。分类树和回归树有些共同点和不同点—例如处理在何处分裂的问题。有些集成的方法产生多棵树:    装袋算法(Bagging), 是一个早期的集成方法,用有放回抽样法来训练多棵决策树,最终结果用投票法产生。    随机森林(Random Forest) 使用多棵决策树来改进分类性能。    提升树(Boosting Tree) 可以用来做回归分析和分类决策。    旋转森林(Rotation forest) – 每棵树的训练首先使用主元分析法 (PCA)。还有其他很多决策树算法,常见的有:    ID3算法    C4.5算法    CHi-squared Automatic Interaction Detector (CHAID), 在生成树的过程中用多层分裂 。    MARS可以更好的处理数值型数据。决策树的优点与其他的数据挖掘算法相比,决策树有许多优点:    易于理解和解释 人们很容易理解决策树的意义。    只需很少的数据准备 其他技术往往需要数据归一化。    即可以处理数值型数据也可以处理类别型 数据。其他技术往往只能处理一种数据类型。例如关联规则只能处理类别型的而神经网络只能处理数值型的数据。    使用白箱 模型. 输出结果容易通过模型的结构来解释。而神经网络是黑箱模型,很难解释输出的结果。    可以通过测试集来验证模型的性能 。可以考虑模型的稳定性。    强健控制. 对噪声处理有好的强健性。    可以很好的处理大规模数据 。缺点    训练一棵最优的决策树是一个完全NP问题。因此, 实际应用时决策树的训练采用启发式搜索算法例如 贪心算法 来达到局部最优。这样的算法没办法得到最优的决策树。    决策树创建的过度复杂会导致无法很好的预测训练集之外的数据。这称作过拟合。 剪枝机制可以避免这种问题。    有些问题决策树没办法很好的解决,例如 异或问题。解决这种问题的时候,决策树会变得过大。 要解决这种问题,只能改变问题的领域或者使用其他更为耗时的学习算法 (例如统计关系学习 或者 归纳逻辑编程).    对那些有类别型属性的数据, 信息增益 会有一定的偏置。参考资料Induction of decisiontrees" Machine Learning An Exploratory Technque for Investigating Large Quantities of Categorical Data  Bias of ImportanceMeasures for Multi-valued Attributes and Solutions  A Survey of Evolutinary Algorithms for Decision-Tree Induction  
  • [执行问题] 【MindSpore】训练模型出错
    训练环境:华为云镜像tensorflow1.15-mindspore1.5.1-cann5.0.2-euler2.8-aarch64训练开始后报错,请问可能是那个地方的原因—————————————Start Train—————————————[WARNING] DEVICE(23718,ffff5b7fe1e0,python):2022-06-26-17:34:34.610.849 [mindspore/ccsrc/runtime/device/ascend/kernel_select_ascend.cc:519] SelectKernelInfo] >>> The supported kernel info(input and output data type) candidates list:[WARNING] DEVICE(23718,ffff5b7fe1e0,python):2022-06-26-17:34:34.610.915 [mindspore/ccsrc/runtime/device/ascend/kernel_select_ascend.cc:521] SelectKernelInfo] Ai_core kernel info [0] :(<Int32xDefaultFormat>) -> (<Int32xDefaultFormat>)[WARNING] DEVICE(23718,ffff5b7fe1e0,python):2022-06-26-17:34:34.610.951 [mindspore/ccsrc/runtime/device/ascend/kernel_select_ascend.cc:521] SelectKernelInfo] Ai_core kernel info [1] :(<Float16xDefaultFormat>) -> (<Float16xDefaultFormat>)[WARNING] DEVICE(23718,ffff5b7fe1e0,python):2022-06-26-17:34:34.610.967 [mindspore/ccsrc/runtime/device/ascend/kernel_select_ascend.cc:521] SelectKernelInfo] Ai_core kernel info [2] :(<Float32xDefaultFormat>) -> (<Float32xDefaultFormat>)[WARNING] DEVICE(23718,ffff5b7fe1e0,python):2022-06-26-17:34:34.610.982 [mindspore/ccsrc/runtime/device/ascend/kernel_select_ascend.cc:521] SelectKernelInfo] Ai_core kernel info [3] :(<Int8xDefaultFormat>) -> (<Int8xDefaultFormat>)[WARNING] DEVICE(23718,ffff5b7fe1e0,python):2022-06-26-17:34:34.610.997 [mindspore/ccsrc/runtime/device/ascend/kernel_select_ascend.cc:521] SelectKernelInfo] Ai_core kernel info [4] :(<UInt8xDefaultFormat>) -> (<UInt8xDefaultFormat>)[WARNING] DEVICE(23718,ffff5b7fe1e0,python):2022-06-26-17:34:34.611.011 [mindspore/ccsrc/runtime/device/ascend/kernel_select_ascend.cc:521] SelectKernelInfo] Ai_core kernel info [5] :(<BoolxDefaultFormat>) -> (<BoolxDefaultFormat>)[WARNING] DEVICE(23718,ffff5b7fe1e0,python):2022-06-26-17:34:34.611.025 [mindspore/ccsrc/runtime/device/ascend/kernel_select_ascend.cc:533] SelectKernelInfo]  <<<[EXCEPTION] DEVICE(23718,ffff5b7fe1e0,python):2022-06-26-17:34:34.611.170 [mindspore/ccsrc/runtime/device/ascend/kernel_select_ascend.cc:534] SelectKernelInfo] Can not find any available operator info for operator [Default/TensorMove-op6953]. Maybe don't supported the data type:       : (<Tensor, (6)>) -> (<Tensor, (6)>), or maybe the operator can not supported on current platform. Node trace: In file /home/ma-user/anaconda3/envs/MindSpore/lib/python3.7/site-packages/mindspore/train/dataset_helper.py(78)/        outputs = self.get_next()/Corresponding forward node candidate:Traceback (most recent call last):  File "./1/train.py", line 207, in <module>    model.train(epoch=epochs, train_dataset=train_dataset, callbacks=[ckpoint_cb,cb,eval_cb])  File "/home/ma-user/anaconda3/envs/MindSpore/lib/python3.7/site-packages/mindspore/train/model.py", line 726, in train    sink_size=sink_size)  File "/home/ma-user/anaconda3/envs/MindSpore/lib/python3.7/site-packages/mindspore/train/model.py", line 504, in _train    self._train_dataset_sink_process(epoch, train_dataset, list_callback, cb_params, sink_size)  File "/home/ma-user/anaconda3/envs/MindSpore/lib/python3.7/site-packages/mindspore/train/model.py", line 566, in _train_dataset_sink_process    outputs = self._train_network(*inputs)  File "/home/ma-user/anaconda3/envs/MindSpore/lib/python3.7/site-packages/mindspore/nn/cell.py", line 404, in __call__    out = self.compile_and_run(*inputs)  File "/home/ma-user/anaconda3/envs/MindSpore/lib/python3.7/site-packages/mindspore/nn/cell.py", line 682, in compile_and_run    self.compile(*inputs)  File "/home/ma-user/anaconda3/envs/MindSpore/lib/python3.7/site-packages/mindspore/nn/cell.py", line 669, in compile    _cell_graph_executor.compile(self, *inputs, phase=self.phase, auto_parallel_mode=self._auto_parallel_mode)  File "/home/ma-user/anaconda3/envs/MindSpore/lib/python3.7/site-packages/mindspore/common/api.py", line 548, in compile    result = self._graph_executor.compile(obj, args_list, phase, use_vm, self.queue_name)RuntimeError: mindspore/ccsrc/runtime/device/ascend/kernel_select_ascend.cc:534 SelectKernelInfo] Can not find any available operator info for operator [Default/TensorMove-op6953]. Maybe don't supported the data type:       : (<Tensor, (6)>) -> (<Tensor, (6)>), or maybe the operator can not supported on current platform. Node trace: In file /home/ma-user/anaconda3/envs/MindSpore/lib/python3.7/site-packages/mindspore/train/dataset_helper.py(78)/        outputs = self.get_next()/Corresponding forward node candidate:# [WARNING] MD(23718,ffffb2b055d0,python):2022-06-26-17:34:34.968.702 [mindspore/ccsrc/minddata/dataset/engine/datasetops/device_queue_op.cc:74] ~DeviceQueueOp] preprocess_batch: 14; batch_queue: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; push_start_time: 2022-06-26-17:33:51.804.919, 2022-06-26-17:33:52.395.811, 2022-06-26-17:33:53.132.138, 2022-06-26-17:33:54.402.327, 2022-06-26-17:33:54.879.494, 2022-06-26-17:33:56.516.524, 2022-06-26-17:34:05.454.040, 2022-06-26-17:34:06.225.521, 2022-06-26-17:34:09.170.642, 2022-06-26-17:34:09.989.649; push_end_time: 2022-06-26-17:33:51.810.063, 2022-06-26-17:33:52.403.808, 2022-06-26-17:33:53.135.061, 2022-06-26-17:33:54.405.361, 2022-06-26-17:33:54.882.735, 2022-06-26-17:33:56.519.988, 2022-06-26-17:34:05.461.083, 2022-06-26-17:34:06.234.153, 2022-06-26-17:34:09.174.033, 2022-06-26-17:34:09.998.590.
  • [其他] 联结主义人工智能的基本观点
    联结主义人工智能的基本观点是:人工智能必须能够模仿大脑的功能,更具体地强调机器应具有学习能力和认知能力,通过学习来解决问题。联结主义人工能特指感知机、神经网络发展的机器学习,广泛意义上也可以包括强化学习以及其他机器学习方法。联结主义人工智能主要解决模式识别、聚类、分类、联想等非结构化同题。早在20世纪40年代,McCulloch和Walter开创了集成认知神经学、科学和数理逻辑计算的计算神经学,提出了最早的神经网络模型,给出了神经元的形式化数学描述和网络结构、证明了单个神经元能执行逻辑功能。1958年,Frank将感知器建立在一个非线性神经元上,得到了神经元的Pitts模型。这是在计算机有限运算能力的条件下,基于硬件结构建立的第一个可进行模式识别的单层神经网络模型。但在此后的一段时间内,神经网络模型仍然无法测试,而且连比较基本的异或(XOR)的逻辑运算都不能实现,即便多层神经网络也不具有低复杂度,相关研究进人了长达20年的停滞状态。1974年,哈佛大学的Paul首次提出误差反向传播算法,不仅解决了异或运算问题,而且大大提升了神经网络迭代计算效率。直到20世纪80年代,神经网络才再度迎来研究高潮。1982年,John提出了可用作联想存储器的互连网络模型,该模型是一种从输出到输人有反愦连接的循环神经网络。1986年,David等人在神经网络上应用了反向传播算法。1989年,Yann等人受日本学者福岛邦彦提出的仿生视觉皮层神经网络模型等的启发,构建了应用于计算机视觉问题的包含2个卷积层和2个全连接层的神经网络,正式提出了卷积神经网络,并于1998年构建更完备的卷积神经网络LeNet-5,成功用于解决手写识别问题。2006年,Hinton等人发表文章,提出将预训练、自编码器与深度神经网络结合,开启了深度学习(深度神经网络)在学术界和工业界的研究与应用浪潮,相继在语音识别、图像识别等领域开展应用,显著降低了错误识别率。2011年后,深度学习开始将卷积层与最大池化层合并,并将其输出传递给几个全连接层,再传递给输出层。2013年4月,美国麻省理了学院(MIT)的《麻省理工科技评论》将深度学习列为2013年十大突破性技术之一。2014年,当时还在蒙特利尔大学读博上的Ian等人提出生成对抗网络溉念,使得神经网络系统不仅能够更好地生成图像与声音,还能识别它们,从而奠定了无监督自主学习算法框架的基础。2015年,谷歌DeepMind提出正式的Deep Q Networks系统。2016年,融合了深度学习、强化学习和蒙特卡罗树搜索方法的AlphaGo战胜了世界围棋高手李世石。这些研究让联结主义大放异彩,也是当前人工智能高潮形成的主因。其他机器学习方向也在不断取得成果。早在1952年,IBM科学家Arthur开发了一个跳棋程序。该程序能够通过观察当前位置,并学习一个隐含的模型,为后续动作提供更好的指导。从1984年开始,Leo Breiman等人相继提出了适用于分类和连续输人(特征)/输出(预测)变量回归预测建模问题的决策树算法和多决策树组合的随机森林算法,后者属于集成学习范畴。1995年,由Corinna等人提出了支持向量机的溉念,通过Kernel的技巧将低维空间线性不可分或难分的样本数据点映射至高维空间使其线性可分,在解决小样本、非线性以及高维模式识别问题方面具有明显优势。
  • [模型训练] 【课程作业经验】盘古α模型数据集生成以及训练初始化问题解决方案
    盘古模型代码及指导:https://gitee.com/mindspore/models/tree/r1.5/official/nlp/pangu_alpha环境:华为云ModelArts ;Ascend:8*Ascend 910;Mindspore 1.5.1;PyTorch 1.8一、【盘古数据集生成】1.将数据集转换成TXT文档(编码:UTF-8)2.上传至工作根目录data文件夹中 3.执行指令 :python -m src.preprocess --input_glob 'data/*.txt' --tokenizer gpt --eot 50256 --data_column_name input_ids --seq_length 1025(需要提前pip sentencepiece、jieba、transformers、torch ) 生成结果如图:二:【盘古模型初始化】直接运行代码会产生无法初始化的问题,因为普通开发者没有root权限,无法获取hccl_8p.json文件,并且客服明确回复因为安全问题无法放开root权限。1.根据昇腾文档:         https://www.hiascend.com/document/detail/zh/canncommercial/51RC1/modeldev/tfmigr/tfmigr_mprtg_0011.html         模板自行配置盘古模型初始化文件hccl_8p.json文档中的说明“可以在当前Server执行指令cat /etc/hccn.conf获取网卡IP”,同样由于没有root权限无法获取真实IP。同时注意到 https://support.huaweicloud.com/instg-cann505alpha1/atlasdeploy_03_0059.html 中有这样一段话:         AI Server中的第0/4,1/5,2/6,3/7号网卡需处于同一网段,第0/1/2/3号网卡在不同网段,第4/5/6/7号网卡在不同网段。最终本次实验hccl_8p.json文件见附件(hccl_8p.txt)2.配置好json文件后在terminal中执行相关指令:bash scripts/run_distribute_train.sh /home/ma-user/work/data/ /home/ma-user/work/hccl_8p.json 8 fp32 2.6B 1 1 8 0 8,可以运行且没有中断,所配置的IP是有效的,ModelArts工程师也说明了这一点3.运行之后,资源监控处可以看到占用N卡,模型正在训练并且生成了左边的strategy.ckpt文件,log中的warning是精度问题可以忽略,参考:https://bbs.huaweicloud.com/forum/thread-187278-1-1.html4.由于AICore显示为0%,因此询问了华为云工程师给出了可能的原因:同时华为云工程师也进行了后台检测,AICore实际上在训练,只是没有返回使用率:5.模型成功进入训练,盘古模型训练时间较长,由于平台时限,最终中断。
  • [问题求助] 【atlas200dk】【mindxsdk环境变量问题】undefined symbol: hi_mpi_dvpp_free
    【功能模块】利用200dk实现目标检测功能,安装好mindxsdk后,运行一个目标检测的样例程序出现报错,ImportError: /home/HwHiAiUser/MindX/mxManufacture/lib/libmxbase.so: undefined symbol: hi_mpi_dvpp_free,如截图所示【操作步骤&问题现象】1、根据往期昇腾训练营的内容,想利用200dk实现该过程,导入环境变量,并跑所给的main.py程序,出现截图报错,猜测错误原因是导入环境变量这一步骤有问题,我是利用的200dk硬件,而训练营中是利用的310的ECS。所参照的训练营内容链接season2/lecture/week3 · kongchibin/ascend_camp - 码云 - 开源中国 (gitee.com)2.根据训练营给的导入环境变量,将其改为了如下的环境变量:export MX_SDK_HOME=/home/HwHiAiUser/MindX/mxManufactureexport LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/home/HwHiAiUser/Ascend/ascend-toolkit/latest/acllib/lib64:/home/HwHiAiUser/Ascend/driver/lib64/export GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scannerexport GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/pluginsexport PYTHONPATH=${MX_SDK_HOME}/python3.问题在于没有找到合适的教程配置mindxsdk的环境变量,只能找一个类似的往期训练营内容来参考,所以出现了一些难以解决的问题。【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [干货汇总] 机器学习实践:基于支持向量机算法对鸢尾花进行分类
    【摘要】 @[toc] 一.前言 1.1 本文原理支持向量机(SVM)是一种二元分类模型。它的基本模型是在特征空间中定义最大区间的线性分类器,这使它不同于感知器;支持向量机还包括核技术,这使得它本质上是一个非线性分类器。支持向量机的学习策略是区间最大化,它可以形式化为求解凸二次规划的问题,等价于正则化铰链损失函数的最小化。支持向量机的学习算法是求解凸二次规划的优化算法。Scikit learn(skl...本文分享自华为云社区《支持向量机算法之鸢尾花特征分类【机器学习】》,作者:上进小菜猪。一.前言1.1 本文原理支持向量机(SVM)是一种二元分类模型。它的基本模型是在特征空间中定义最大区间的线性分类器,这使它不同于感知器;支持向量机还包括核技术,这使得它本质上是一个非线性分类器。支持向量机的学习策略是区间最大化,它可以形式化为求解凸二次规划的问题,等价于正则化铰链损失函数的最小化。支持向量机的学习算法是求解凸二次规划的优化算法。Scikit learn(sklearn)是机器学习中常见的第三方模块。它封装了常见的机器学习方法,包括回归、降维、分类、聚类等。1.2 本文目的List item使用scikit-learn机器学习包的支持向量机算法,使用全部特征对鸢尾花进行分类;使用scikit-learn机器学习包的支持向量机算法,设置SVM对象的参数,包括kernel、gamma和C,分别选择一个特征、两个特征、三个特征,写代码对鸢尾花进行分类;使用scikit-learn机器学习包的支持向量机算法,选择特征0和特征2对鸢尾花分类并画图,gamma参数分别设置为1、10、100,运行程序并截图,观察gamma参数对训练分数(score)的影响,请说明如果错误调整gamma参数会产生什么问题?二.实验过程2.1 支持向量机算法SVM实例的特征向量(以2D为例)映射到空间中的一些点,如下图中的实心点和空心点,它们属于两个不同的类别。支持向量机的目的是画一条线来“最好”区分这两类点,这样,如果将来有新的点,这条线也可以很好地进行分类。2.2List item使用scikit-learn机器学习包的支持向量机算法,使用全部特征对鸢尾花进行分类;首先引入向量机算法svm模块:from sklearn import svm还是老样子,使用load_iris模块,里面有150组鸢尾花特征数据,我们可以拿来进行学习特征分类。如下代码:from sklearn.datasets import load_irisiris = load_iris()X = iris.dataprint(X.shape, X)y = iris.targetprint(y.shape, y)下面使用sklearn.svm.SVC()函数。C-支持向量分类器如下:svm=svm.SVC(kernel='rbf',C=1,gamma='auto')使用全部特征对鸢尾花进行分类svm.fit(X[:,:4],y)输出训练得分:print("training score:",svm.score(X[:,:4],y))print("predict: ",svm.predict([[7,5,2,0.5],[7.5,4,7,2]]))使用全部特征对鸢尾花进行分类训练得分如下:2.3 使用scikit-learn机器学习包的支持向量机算法,设置SVM对象的参数,包括kernel、gamma和C,分别选择一个特征、两个特征、三个特征,写代码对鸢尾花进行分类;2.3.1 使用一个特征对鸢尾花进行分类上面提过的基础就不再写了。如下代码:使用一个特征对鸢尾花进行分类,如下代码:svm=svm.SVC()svm.fit(X,y)输出训练得分:print("training score:",svm.score(X,y))print("predict: ",svm.predict([[7,5,2,0.5],[7.5,4,7,2]]))使用一个特征对鸢尾花进行分类训练得分如下:2.3.2 使用两个特征对鸢尾花进行分类使用两个特征对鸢尾花进行分类,如下代码:svm=svm.SVC()svm.fit(X[:,:1],y)输出训练得分:print("training score:",svm.score(X[:,:1],y))print("predict: ",svm.predict([[7],[7.5]]))使用两个特征对鸢尾花进行分类训练得分如下:2.3.3 使用三个特征对鸢尾花进行分类使用三个特征对鸢尾花进行分类,如下代码:svm=svm.SVC(kernel='rbf',C=1,gamma='auto')svm.fit(X[:,1:3],y)输出训练得分:print("training score:",svm.score(X[:,1:3],y))print("predict: ",svm.predict([[7,5],[7.5,4]]))使用三个特征对鸢尾花进行分类训练得分如下:2.3.4 可视化三个特征分类结果使用plt.subplot()函数用于直接指定划分方式和位置进行绘图。x_min,x_max=X[:,1].min()-1,X[:,1].max()+1v_min,v_max=X[:,2].min()-1,X[:,2].max()+1h=(x_max/x_min)/100xx,vy =np.meshgrid(np.arange(x_min,x_max,h),np.arange(v_min,v_max,h))plt.subplot(1,1,1)Z=svm.predict(np.c_[xx.ravel(),vy.ravel()])Z=Z.reshape(xx.shape)绘图,输出可视化。如下代码plt.contourf(xx,vy,Z,cmap=plt.cm.Paired,alpha=0.8)plt.scatter(X[:, 1], X[:, 2], c=y, cmap=plt.cm.Paired)plt.xlabel('Sepal width')plt.vlabel('Petal length')plt.xlim(xx.min(), xx.max())plt.title('SVC with linear kernel')plt.show()可视化三个特征分类结果图:2.4使用scikit-learn机器学习包的支持向量机算法,选择特征0和特征2对鸢尾花分类并画图,gamma参数分别设置为1、10、100,运行程序并截图,观察gamma参数对训练分数(score)的影响,请说明如果错误调整gamma参数会产生什么问题?2.4.1当gamma为1时:讲上文的gamma='auto‘ 里的auto改为1,得如下代码:svm=svm.SVC(kernel='rbf',C=1,gamma='1')svm.fit(X[:,1:3],y)运行上文可视化代码,得如下结果:2.4.2当gamma为10时:讲上文的gamma='auto‘ 里的auto改为10,得如下代码:svm=svm.SVC(kernel='rbf',C=1,gamma='10')svm.fit(X[:,:3:2],y)运行上文可视化代码,得如下结果:2.4.3当gamma为100时:讲上文的gamma='auto‘ 里的auto改为100,得如下代码:svm=svm.SVC(kernel='rbf',C=1,gamma='100')svm.fit(X[:,:3:2],y)运行上文可视化代码,得如下结果:2.4.4 结论参数gamma主要是对低维的样本进行高度度映射,gamma值越大映射的维度越高,训练的结果越好,但是越容易引起过拟合,即泛化能力低。通过上面的图可以看出gamma值越大,分数(score)越高。错误使用gamma值可能会引起过拟合,太低可能训练的结果太差。
  • [其他] 闭式同构变换的时间序列对齐
    时间序列对齐方法需要具有高度表达性、可微性和可逆性的扭曲函数来保持时间拓扑,即差分同构。在常微分方程(ODE)控制下的速度场积分可以产生异形扭曲函数。包含异构变换的基于梯度的优化框架需要计算微分方程的解对模型参数的导数,即敏感性分析。不幸的是,深度学习框架通常缺乏自动微分兼容的灵敏度分析方法;隐函数,比如ODE的解,需要特别小心。目前的解决方案呼吁伴随灵敏度方法,特别的数值求解或ResNet的欧拉离散化。在这项工作中,我们提出了一个闭合形式的ODE解及其梯度在连续分段仿射(CPA)速度函数。我们提出了一个高度优化的结果在CPU和GPU上的实现。此外,我们在多个数据集上进行了大量的实验,以验证我们的模型对不可见数据的泛化能力。结果表明,在效率和准确性方面都有显著提高。https://www.zhuanzhi.ai/paper/6bf12cef7552c6267240f4067265d338
  • [其他] 浅谈贝叶斯分析方法
    贝叶斯分析方法(Bayesian Analysis)是贝叶斯学习的基础,它提供了一种计算假设概率的方法,这种方法是基于假设的先验概率、给定假设下观察到不同数据的概率以及观察到的数据本身而得出的。其方法为,将关于未知参数的先验信息与样本信息综合,再根据贝叶斯公式,得出后验信息,然后根据后验信息去推断未知参数的方法。计算后验分布期望的传统数值计算方法是数值积分、拉普莱斯近似计算和蒙特卡洛(Monte Carlo)重要抽样。MCMC方法,即马尔可夫链——蒙特卡罗(Markov chain Monte Carlo)方法已经变成了非常流行的贝叶斯计算方法。一方面是由于它处理非常复杂问题的效率,另一方面是因为它的编程方法相对容易。贝叶斯分析方法(Bayesian Analysis)提供了一种计算假设概率的方法,这种方法是基于假设的先验概率、给定假设下观察到不同数据的概率以及观察到的数据本身而得出的。其方法为,将关于未知参数的先验信息与样本信息综合,再根据贝叶斯公式,得出后验信息,然后根据后验信息去推断未知参数的方法。在贝叶斯统计理论中,统计推断中的相关量均作为随机量对待,而不考虑其是否产生随机值。概率被理解为基于给定信息下对相关量不完全了解的程度,对于具有相同可能性的随机事件认为具有相同的概率。在进行测量不确定度的贝叶斯评定时,与测量结果推断或不确是度评定相关的每一个物理量均被分配一个随机变量,分布宽度常用标准差表示,反映了对未知真值了解的程度。按照贝叶斯理论,与测量或相关评定工作有关的每一个物理量均被分配一个随机变量,尽管每一个估计量和它所表示的相关被测量是不相同的,但它是用来估计被测量的待定真值的。贝叶斯理论基础经典统计在对随机分布参数进行参数估计时,假定待估计参数是未知常数,并认定这些参数的信息仅由样本携带,于是通过对样本“毫无偏见”的加工来获得参数估计。由于估计量可能有不完善之处,估计误差在所难免,因此经典统计理论中用置信区间表示这些误差的大小。在对概率的理解上,经典统计认为概率就是频率的稳定值。一旦离开了重复试验,就谈不上去理解概率。因此要精确估计上述参数,必须保证有大量的数据样本,但在工程中实测数据毕竟有限。另外,统计抽样时所要求的样本独立同分布的条件也很难满足。贝叶斯统计理论在估计随机分布参数时,认为待估计参数是随机变量,存在概率分布。贝叶斯方法对概率的理解是人们对某些事件的一种信任程度,是对事物的不确定性的一种主观判断,与个人因素等有关,,故称之为主观概率。贝叶斯统计中的先验分布反映的就是人们对于待估计参数的主观概率。为了在小样本量下能获得较好的参数估计,就必须利用参数的历史资料或先验知识。在进行参数估计时,贝叶斯学派认为后验分布综合了先验和样本的知识,可以对参数作出较先验分布更合理的估计,故其参数估计都是建立在后验分布基础上的,该方法对研究除观测数据外还具备较多信息的情况特别有效。尽管贝叶斯方法与经典统计方法有很大的不同,但在大样本条件下,由这两种方法估计出的参数是一致的。而在小样本的情况下,贝叶斯方法可充分利用各种信息,结果更为可靠。贝叶斯方法的特点是能充分利用现有信息,如总体信息、经验信息和样本信息等,将统计推断建立在后验分布的基础上。这样不但可以减少因样本量小而带来的统计误差,而且在没有数据样本的情况下也可以进行推断。贝叶斯理论是贝叶斯分析的基本工具,是以全概率法则为依据建立的。
  • [执行问题] 【MindSpore】【MTCNN多标签模型训练】训练时损失函数部分报错
    尝试基于mindspore训练MTCNN模型中的PNet,没有成功。【操作步骤&问题现象】1、数据集已经生成完毕,迭代的时候可输出正确的数据集信息,没有问题。2、由于输出包括是否含人脸、人脸回归框、人脸关键点等多项结果,故自定义损失函数、自定义含前向网络和损失函数的网络、自定义训练网络。3、前向网络应该没问题,目前的报错是损失函数当中,本应有数据的输入参数值是None,由此引发一系列报错:“ValueError: mindspore\core%utils\check_convert_utils.cc:397 CheckInteger] For primitive[SoftmaxCrossEntropyWithLogits], the dimension of labels must be equal to 2, but got 0.” (该错误为损失函数中某语句产生的报错,由于变量值是None,其他语句也会报错)【部分代码】```pythonclass ClassLoss(nn.LossBase): # 判断是否含有人脸的网络的输出的损失函数 def __init__(self): super(ClassLoss, self).__init__() self.entropy_loss = nn.SoftmaxCrossEntropyWithLogits(reduction='none') self.keep_ratio = 0.7 def construct(self, class_out, label): # 保留neg 0 和pos 1 的数据,忽略掉part -1, landmark -2 oneslike = op.OnesLike() zeroslike = op.ZerosLike() label = ms.numpy.where(label < 0, (-100) * oneslike(label), label) # 求neg 0 和pos 1 的数据70%数据 valid_label = ms.numpy.where(label >= 0, oneslike(label), zeroslike(label)) reducesum = op.ReduceSum() num_valid = reducesum(valid_label) # = torch.sum keep_num = int((num_valid * self.keep_ratio)) squeeze = op.Squeeze() label = squeeze(label) # 计算交叉熵损失 cast = op.Cast() label = self.cast(label, ms.float32) loss = self.entropy_loss(logits=class_out, labels=label) # 取有效数据的70%计算损失 topk = op.TopK() loss, _ = topk(op.Squeeze(loss), keep_num) # 默认选择最后一维 reducemean = op.ReduceMean() return reducemean(loss)class LossForMultiLabel(nn.LossBase): # 总的损失函数 def __init__(self, reduction="mean"): super(LossForMultiLabel, self).__init__() self.class_loss = ClassLoss() self.bbox_loss = BBoxLoss() self.landmark_loss = LandmarkLoss() def construct(self, class_out, bbox_out, landmark_out, label, bbox, landmark): # 设置损失值的比例 radio_cls_loss = 1.0 radio_bbox_loss = 0.5 radio_landmark_loss = 0.5 cls_loss = self.class_loss(class_out, label) box_loss = self.bbox_loss(bbox_out, bbox, label) landmarks_loss = self.landmark_loss(landmark_out, landmark, label) total_loss = radio_cls_loss * cls_loss + radio_bbox_loss * box_loss + radio_landmark_loss * landmarks_loss # total_loss = self.cast(total_loss, ms.dtype.float32) return self.get_loss(total_loss)class PNetWithLossCell(nn.Cell): # 包含前向网络和损失函数的自定义网络 def __init__(self, backbone, loss_fn, auto_prefix=True): super(PNetWithLossCell, self).__init__(auto_prefix=auto_prefix) self._backbone = backbone self._loss_fn = loss_fn def construct(self, img, label, bbox, landmark): class_out, bbox_out, landmark_out = self._backbone(img) loss_PNet = self._loss_fn(class_out, bbox_out, landmark_out, label, bbox, landmark) return loss_PNetclass CustomTrainOneStepCell(nn.Cell): def __init__(self, network, optimizer, sens=1.0): super(CustomTrainOneStepCell, self).__init__(auto_prefix=False) self.network = network self.network.set_grad() self.optimizer = optimizer self.weights = self.optimizer.parameters self.grad = op.GradOperation(get_by_list=True, sens_param=True) self.sens = sens def construct(self, img, label, bbox, landmark): weights = self.weights loss = self.network(img, label, bbox, landmark) # 这行代码运行时可以print,数据没问题,正确传入了 grads = self.grad(self.network, weights)(img, label, bbox, landmark, self.sens) self.optimizer(grads) loss = op.depend(loss, self.optimizer(grads)) return lossif __name__ == '__main__': # main中部分代码 context.set_context(device_target='CPU') net = PNet() loss_fn = LossForMultiLabel() opt = nn.Adam(params=net.trainable_params(), learning_rate=1e-3, weight_decay=0) PNetWithLoss = PNetWithLossCell(net, loss_fn) train_net = CustomTrainOneStepCell(network=PNetWithLoss, optimizer=opt) train_net.set_train() for epoch in range(epoch_num): for d in train_dataset.create_dict_iterator(): print(step) result = train_net(d["img"], d["label"], d["bbox"], d["landmark"]) print(f"Epoch: [{epoch} / {epoch_num}], " f"step: [{step} / {steps}]") step = step + 1```
  • [其他] 浅谈EM算法
    最大期望算法(Expectation-Maximization algorithm, EM),或Dempster-Laird-Rubin算法,是一类通过迭代进行极大似然估计(Maximum Likelihood Estimation, MLE)的优化算法,通常作为牛顿迭代法(Newton-Raphson method)的替代用于对包含隐变量(latent variable)或缺失数据(incomplete-data)的概率模型进行参数估计。EM算法的标准计算框架由E步(Expectation-step)和M步(Maximization step)交替组成,算法的收敛性可以确保迭代至少逼近局部极大值 。EM算法是MM算法(Minorize-Maximization algorithm)的特例之一,有多个改进版本,包括使用了贝叶斯推断的EM算法、EM梯度算法、广义EM算法等。由于迭代规则容易实现并可以灵活考虑隐变量 ,EM算法被广泛应用于处理数据的缺测值,以及很多机器学习(machine learning)算法,包括高斯混合模型(Gaussian Mixture Model, GMM)和隐马尔可夫模型(Hidden Markov Model, HMM)的参数估计。对EM算法的研究起源于统计学的误差分析(error analysis)问题。1886年,美国数学家Simon Newcomb在使用高斯混合模型(Gaussian Mixture Model, GMM)解释观测误差的长尾效应时提出了类似EM算法的迭代求解技术 。在极大似然估计(Maximum Likelihood Estimation, MLE)方法出现后,英国学者Anderson McKendrick在1926年发展了Newcomb的理论并在医学样本中进行了应用。1956年,Michael Healy和Michael Westmacott提出了统计学试验中估计缺失数据的迭代方法 ,该方法被认为是EM算法的一个特例。1970年,B. J. N. Blight使用MLE对指数族分布的I型删失数据(Type I censored data)进行了讨论 。Rolf Sundberg在1971至1974年进一步发展了指数族分布样本的MLE并给出了迭代计算的完整推导。EM算法的正式提出来自美国数学家Arthur Dempster、Nan Laird和Donald Rubin,其在1977年发表的研究对先前出现的作为特例的EM算法进行了总结并给出了标准算法的计算步骤,EM算法也由此被称为Dempster-Laird-Rubin算法 。1983年,美国数学家吴建福(C.F. Jeff Wu)给出了EM算法在指数族分布以外的收敛性证明。此外,在二十世纪60-70年代对隐马尔可夫模型(Hidden Markov Model, HMM)的研究中,Leonard E. Baum提出的基于MLE的HMM参数估计方法,即Baum-Welch算法(Baum-Welch algorithm)也是EM算法的特例之一 。应用:数据分析,机器学习 在Python 3环境使用EM算法求解GMM的编程实现:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788# 导入模块import numpy as npimport matplotlib.pyplot as pltfrom scipy.stats import multivariate_normal# 构建测试数据N = 200; pi1 = np.array([0.6, 0.3, 0.1])mu1 = np.array([[0,4], [-2,0], [3,-3]])sigma1 = np.array([[[3,0],[0,0.5]], [[1,0],[0,2]], [[.5,0],[0,.5]]])gen = [np.random.multivariate_normal(mu, sigma, int(pi*N)) for mu, sigma, pi in zip(mu1, sigma1, pi1)]X = np.concatenate(gen)# 初始化: mu, sigma, pi = 均值, 协方差矩阵, 混合系数theta = {}; param = {}theta['pi'] = [1/3, 1/3, 1/3]            # 均匀初始化theta['mu'] = np.random.random((3, 2))   # 随机初始化theta['sigma'] = np.array([np.eye(2)]*3) # 初始化为单位正定矩阵param['k'] = len(pi1); param['N'] = X.shape[0]; param['dim'] = X.shape[1]# 定义函数def GMM_component(X, theta, c):    '''    由联合正态分布计算GMM的单个成员    '''    return theta['pi'][c]*multivariate_normal(theta['mu'][c], theta['sigma'][c, ...]).pdf(X) def E_step(theta, param):    '''    E步:更新隐变量概率分布q(Z)。    '''    q = np.zeros((param['k'], param['N']))    for i in range(param['k']):        q = GMM_component(X, theta, i)    q /= q.sum(axis=0)    return q def M_step(X, q, theta, param):    '''    M步:使用q(Z)更新GMM参数。    '''    pi_temp = q.sum(axis=1); pi_temp /= param['N'] # 计算pi    mu_temp = q.dot(X); mu_temp /= q.sum(axis=1)[:, None] # 计算mu    sigma_temp = np.zeros((param['k'], param['dim'], param['dim']))    for i in range(param['k']):        ys = X - mu_temp        sigma_temp = np.sum(q*np.matmul(ys[..., None], ys[:, None, :]), axis=0)    sigma_temp /= np.sum(q, axis=1)[:, None, None] # 计算sigma    theta['pi'] = pi_temp; theta['mu'] = mu_temp; theta['sigma'] = sigma_temp    return theta def likelihood(X, theta):    '''    计算GMM的对数似然。    '''    ll = 0    for i in range(param['k']):        ll += GMM_component(X, theta, i)    ll = np.log(ll).sum()    return ll def EM_GMM(X, theta, param, eps=1e-5, max_iter=1000):    '''    高斯混合模型的EM算法求解        theta: GMM模型参数; param: 其它系数; eps: 计算精度; max_iter: 最大迭代次数        返回对数似然和参数theta,theta是包含pi、mu、sigma的Python字典    '''    for i in range(max_iter):        ll_old = 0        # E-step        q = E_step(theta, param)        # M-step        theta = M_step(X, q, theta, param)        ll_new = likelihood(X, theta)        if np.abs(ll_new - ll_old) < eps:            break;        else:            ll_old = ll_new    return ll_new, theta# EM算法求解GMM,最大迭代次数为1e5ll, theta2 = EM_GMM(X, theta, param, max_iter=10000)# 由theta计算联合正态分布的概率密度L = 100; Xlim = [-6, 6]; Ylim = [-6, 6]XGrid, YGrid = np.meshgrid(np.linspace(Xlim[0], Xlim[1], L), np.linspace(Ylim[0], Ylim[1], L))Xout = np.vstack([XGrid.ravel(), YGrid.ravel()]).TMVN = np.zeros(L*L)for i in range(param['k']):    MVN += GMM_component(Xout, theta, i)MVN = MVN.reshape((L, L))# 绘制结果plt.plot(X[:, 0], X[:, 1], 'x', c='gray', zorder=1)plt.contour(XGrid, YGrid, MVN, 5, colors=('k',), linewidths=(2,))
  • [其他] 五月新上线的Workflow能做什么
    Workflow(也称工作流,下文中均可使用工作流进行描述)本质是开发者基于实际业务场景开发用于部署模型或应用的流水线工具。在机器学习的场景中,流水线可能会覆盖数据标注、数据处理、模型开发/训练、模型评估、应用开发、应用评估等步骤。区别于传统的机器学习模型构建,开发者可以使用Workflow开发生产流水线。基于MLOps的概念,Workflow会提供运行记录、监控、持续运行等功能。根据角色的分工与概念,产品上将工作流的开发和持续迭代分开。一条流水线由多个节点组成,Workflow SDK提供了流水线需要覆盖的功能以及功能需要的参数描述。用户在开发流水线的时候,使用SDK对节点以及节点之间串联的关系进行描述。对流水线的开发操作在Workflow中统称为Workflow的开发态。当确定好整条流水线后,开发者可以将流水线固化下来,提供给其他人使用。使用者无需关注流水线中包含什么算法,也不需要关注流水线是如何实现的。使用者只需要关注流水线生产出来的模型或者应用是否符合上线要求,如果不符合,是否需要调整数据和参数重新迭代。这种使用固化下来的流水线的状态,在Workflow中统称为运行态。总的来说,Workflow有两种形态:开发态:使用Workflow的Python SDK开发和调测流水线。运行态:可视化配置运行生产好的流水线。Workflow基于对当前ModelArts已有能力的编排。基于DevOps原则和实践,应用于AI开发过程中,提升AI应用开发与落地效率,以达到更快的模型实验和开发和更快的将模型部署到生产。工作流的开发态和运行态分别实现了不同的功能。开发态-开发工作流开发者结合实际业务的需求,通过Workflow提供的Python SDK,将ModelArts模块的能力封装成流水线中的一个个步骤。对于AI开发者来说是非常熟悉的开发模式,而且灵活度极高。Python SDK主要提供以下能力。调测:部分运行、全部运行、debug。发布:发布到运行态。实验记录:实验的持久化及管理。运行态-运行工作流Workflow提供了可视化的工作流运行方式。使用者只需要关注一些简单的参数配置,模型是否需要重新训练和模型当前的部署情况。运行态工作流的来源为:通过开发态发布通过AI Gallery订阅。运行态主要提供以下能力。统一配置管理:管理工作流需要配置的参数及使用的资源等。操作工作流:启动、停止、复制、删除工作流。运行记录:工作流历史运行的参数以及状态记录。
  • [基础知识] 【MindSpore易点通】深度学习系列-那些介于模糊与清楚之间的一些概念
    之前小编就给大家提过正则化(超链接),其实还有很多定义大家是有点模糊又有点清楚的,今天好好带大家一起捋一遍~~1训练集、验证集、测试集正确地配置训练、验证和测试数据集,会很大程度上帮助大家创建高效的神经网络。即使是深度学习专家也不太可能一开始就知道匹配度最高的参数,深度学习网络需要多次循环往复,才能为应用程序找到最佳的神经网络,因此循环该过程的效率是决定项目进展速度的一个关键因素,而创建高质量的训练数据集,验证集和测试集也有助于提高循环效率。 在机器学习发展的小数据量时代,常见做法所有数据中存在70%的验证集,剩下的30%作为测试集,如果没有明确设置验证集的话,可以将训练集、验证集、测试集以3:1:1的标准划分。(这点小编应该也在之前的机器学习系列中给大家普及过)而当涉及大量数据的时候,验证集和测试集占数据总量的比例会趋向于变得更小。(没错,验证集的目的就是验证不同的算法,检验哪种算法更有效,因此,验证集要足够大才能评估,而因为我们的数据总量是巨大的,因此即使验证集所占的比例很小,但是其数据量也是可观的)。所以当数据集规模较大的,验证集和测试集要小于数据总量的20%或10%。当然,小编这里还有两个小TIPS,大家可以细品一下:1.尽可能使验证集和测试集的数据来自同一分布;2.就算没有测试集也无伤大雅,只需要在训练集上训练,尝试不同的模型框架,在验证集上评估这些模型,然后迭代并选出适用的模型。1.2 偏差,方差 假设给上图中的数据集拟合一条直线,可能会得到一个逻辑回归拟合,但是并不能很好地拟合该数据,这就是高偏差(high bias)的情况,即欠拟合。而如果拟合一个非常复杂的分类器适用于这个数据集,这时候就可能会出现方差较高(high variance),数据过度拟合(overfitting)的现象。当然,介于欠拟合与过拟合之间也会存在适度拟合(just right)的情况,使得数据拟合看起来更加合理。理解偏差和方差的两个关键数据是训练集误差(Train set error)和验证集误差(Dev set error)。1.假定训练集误差是1%,验证集误差是11%,可以看出训练集设置得非常好,而验证集设置相对较差,可能过度拟合了训练集,像这种情况,我们称之为“高方差”。2.假设训练集误差是15%,验证集误差是16%,算法并没有在训练集中得到很好训练,如果训练数据的拟合度不高,就是数据欠拟合,就可以说这种算法偏差比较高。另一方面,它对于验证集产生的结果却是合理的,验证集中的错误率只比训练集的多了1%。3.训练集误差是15%,偏差相当高,同时验证集的错误率达到30%,这样一来方差也很高。4.最匹配的结果模型:训练集误差是0.5%,验证集误差是1%,偏差和方差都很低。1.3 处理方法因此当初始模型训练完成后,我们首先需要知道算法的偏差高不高,如果较高,甚至无法拟合训练集,那么我们就需要毫不犹豫地选择一个或多个新的网络。采用规模更大的网络,延长训练时间也可以试试看,直到解决偏差问题,实现数据拟合。如果偏差降低到可以接受的数值,查看验证集性能检查方差,如果方差高,那就是采用更多数据来解决问题,当然无法增加数据,那么就可以采用我们之前提到的正则化来减少过拟合。1.4 正则化如何预防过拟合为什么正则化可以减少方差问题?这里可以具体给大家讲解一下: 左图是高偏差,右图是高方差,中间是恰好合适。 假设上图为一个过拟合的神经网络,代价函数J,含有参数W,b。添加正则项避免数据权值矩阵过大。如果正则化设置得足够大,权重矩阵W被设置为接近于0的值,将多隐藏单元的权重设为0,消除了隐藏单元的影响。如果是这种情况,神经网络会变成一个很小的网络,小到如同一个逻辑回归单元,可是深度却很大,使网络从过度拟合的状态更接近左图的高偏差状态。但是会存在一个中间值,于是就会有一个接近“Just Right”的中间状态。假设使用的是双曲线激活函数。 用g(z)表示tanh(z),只要z非常小,激活函数开始变得非线性。 如果正则化参数λ很大,激活函数的参数会相对较小,因为代价函数中的参数变大了,如果W很小,z也会很小。 总结来说,如果正则化参数变得很大,参数W很小,z也会相对变小,此时忽略b的影响,z会相对变小。激活函数tanh曲线函数会相对呈线性,整个神经网络会计算离线性函数近的值,不会发生过拟合。 当然啦,正则化我们之前只是做了比较简单的介绍,下期我们进行更加详细的介绍~再会!
总条数:4608 到第
上滑加载中