• [其他] 适合新手的深度学习综述(3)--最新进展
    深度架构的演变人工神经网络 (ANN) 已经取得了长足的进步,同时也带来了其他的深度模型。第一代人工神经网络由简单的感知器神经层组成,只能进行有限的简单计算。第二代使用反向传播,根据错误率更新神经元的权重。然后支持向量机 (SVM) 浮出水面,在一段时间内超越 ANN。为了克服反向传播的局限性,人们提出了受限玻尔兹曼机(RBM),使学习更容易。此时其他技术和神经网络也出现了,如前馈神经网络 (FNN)、卷积神经网络 (CNN)、循环神经网络 (RNN) 等,以及深层信念网络、自编码器等。从那时起,为实现各种用途,ANN 在不同方面得到了改进和设计。Schmidhuber (2014)、Bengio (2009)、Deng 和 Yu (2014)、Goodfellow 等人 (2016)、Wang 等人 (2017) 对深度神经网络 (DNN) 的进化和历史以及深度学习 (DL) 进行了详细的概述。在大多数情况下,深层架构是简单架构的多层非线性重复,这样可从输入中获得高度复杂的函数。
  • [其他] 适合新手的深度学习综述(2)--相关研究
    本文转载自机器之心。相关研究   在过去的几年中,有许多关于深度学习的综述论文。他们以很好的方式描述了 DL 方法、方法论以及它们的应用和未来研究方向。这里,我们简要介绍一些关于深度学习的优秀综述论文。Young 等人(2017)讨论了 DL 模型和架构,主要用于自然语言处理(NLP)。他们在不同的 NLP 领域中展示了 DL 应用,比较了 DL 模型,并讨论了可能的未来趋势。Zhang 等人(2017)讨论了用于前端和后端语音识别系统的当前最佳深度学习技术。Zhu 等人(2017)综述了 DL 遥感技术的最新进展。他们还讨论了开源的 DL 框架和其他深度学习的技术细节。Wang 等人(2017)以时间顺序的方式描述了深度学习模型的演变。该短文简要介绍了模型,以及在 DL 研究中的突破。该文以进化的方式来了解深度学习的起源,并对神经网络的优化和未来的研究做了解读。Goodfellow 等人(2016)详细讨论了深度网络和生成模型,从机器学习(ML)基础知识、深度架构的优缺点出发,对近年来的 DL 研究和应用进行了总结。LeCun 等人(2015)从卷积神经网络(CNN)和递归神经网络(RNN)概述了深度学习(DL)模型。他们从表征学习的角度描述了 DL,展示了 DL 技术如何工作、如何在各种应用中成功使用、以及如何对预测未来进行基于无监督学习(UL)的学习。同时他们还指出了 DL 在文献目录中的主要进展。Schmidhuber(2015)从 CNN、RNN 和深度强化学习 (RL) 对深度学习做了一个概述。他强调了序列处理的 RNN,同时指出基本 DL 和 NN 的局限性,以及改进它们的技巧。Nielsen (2015) 用代码和例子描述了神经网络的细节。他还在一定程度上讨论了深度神经网络和深度学习。Schmidhuber (2014) 讨论了基于时间序列的神经网络、采用机器学习方法进行分类,以及在神经网络中使用深度学习的历史和进展。Deng 和 Yu (2014) 描述了深度学习类别和技术,以及 DL 在几个领域的应用。Bengio (2013) 从表征学习的角度简要概述了 DL 算法,即监督和无监督网络、优化和训练模型。他聚焦于深度学习的许多挑战,例如:为更大的模型和数据扩展算法,减少优化困难,设计有效的缩放方法等。Bengio 等人 (2013) 讨论了表征和特征学习即深度学习。他们从应用、技术和挑战的角度探讨了各种方法和模型。Deng (2011) 从信息处理及相关领域的角度对深度结构化学习及其架构进行了概述。Arel 等人 (2010) 简要概述了近年来的 DL 技术。Bengio (2009) 讨论了深度架构,即人工智能的神经网络和生成模型。最近所有关于深度学习(DL)的论文都从多个角度讨论了深度学习重点。这对 DL 的研究人员来说是非常有必要的。然而,DL 目前是一个蓬勃发展的领域。在最近的 DL 概述论文发表之后,仍有许多新的技术和架构被提出。此外,以往的论文从不同的角度进行研究。我们的论文主要是针对刚进入这一领域的学习者和新手。为此,我们将努力为新研究人员和任何对这一领域感兴趣的人提供一个深度学习的基础和清晰的概念。
  • [其他] 适合新手的深度学习综述(1)
    本文转载自机器之心。1. 引言 「深度学习」(DL)一词最初在 1986 被引入机器学习(ML),后来在 2000 年时被用于人工神经网络(ANN)。深度学习方法由多个层组成,以学习具有多个抽象层次的数据特征。DL 方法允许计算机通过相对简单的概念来学习复杂的概念。对于人工神经网络(ANN),深度学习(DL)(也称为分层学习(Hierarchical Learning))是指在多个计算阶段中精确地分配信用,以转换网络中的聚合激活。为了学习复杂的功能,深度架构被用于多个抽象层次,即非线性操作;例如 ANNs,具有许多隐藏层。用准确的话总结就是,深度学习是机器学习的一个子领域,它使用了多层次的非线性信息处理和抽象,用于有监督或无监督的特征学习、表示、分类和模式识别。深度学习即表征学习是机器学习的一个分支或子领域,大多数人认为近代深度学习方法是从 2006 开始发展起来的。本文是关于最新的深度学习技术的综述,主要推荐给即将涉足该领域的研究者。本文包括 DL 的基本思想、主要方法、最新进展以及应用。综述论文是非常有益的,特别是对某一特定领域的新研究人员。一个研究领域如果在不久的将来及相关应用领域中有很大的价值,那通常很难被实时跟踪到最新进展。现在,科学研究是一个很有吸引力的职业,因为知识和教育比以往任何时候都更容易分享和获得。对于一种技术研究的趋势来说,唯一正常的假设是它会在各个方面有很多的改进。几年前对某个领域的概述,现在可能已经过时了。考虑到近年来深度学习的普及和推广,我们简要概述了深度学习和神经网络(NN),以及它的主要进展和几年来的重大突破。我们希望这篇文章将帮助许多新手研究者在这一领域全面了解最近的深度学习的研究和技术,并引导他们以正确的方式开始。同时,我们希望通过这项工作,向这个时代的顶级 DL 和 ANN 研究者们致敬:Geoffrey Hinton(Hinton)、Juergen Schmidhuber(Schmidhuber)、Yann LeCun(LeCun)、Yoshua Bengio(Bengio)和许多其他研究学者,他们的研究构建了现代人工智能(AI)。跟进他们的工作,以追踪当前最佳的 DL 和 ML 研究进展对我们来说也至关重要。在本论文中,我们首先简述过去的研究论文,对深度学习的模型和方法进行研究。然后,我们将开始描述这一领域的最新进展。我们将讨论深度学习(DL)方法、深度架构(即深度神经网络(DNN))和深度生成模型(DGM),其次是重要的正则化和优化方法。此外,用两个简短的部分对于开源的 DL 框架和重要的 DL 应用进行总结。我们将在最后两个章节(即讨论和结论)中讨论深入学习的现状和未来。
  • [其他] 深度学习视觉语音分析
    视觉语音,即语音的视觉领域,因其在公共安全、医疗、军事防御、影视娱乐等领域的广泛应用而受到越来越多的关注。深度学习技术作为一种强大的人工智能策略,广泛地推动了视觉语音学习的发展。在过去的五年中,许多基于深度学习的方法被提出来解决这一领域的各种问题,特别是视觉语音的自动识别和生成。为了进一步推动视觉语音的研究,本文对视觉语音分析中的深度学习方法进行了综述。我们涵盖了视觉语音的不同方面,包括基本问题、挑战、基准数据集、现有方法的分类和最先进的性能。此外,我们还指出了现有研究的不足,并对未来的研究方向进行了探讨。 引言 人类的语言本质上是双峰的: 视觉和听觉。视觉语言是指语言的视觉领域,即在说话[1]时自然产生的嘴唇、舌头、牙齿、下颚等面部肌肉的运动,而音频语言是指说话者发出的声学波形。语言感知本质上是双峰的,正如几十年前著名的McGurk效应[2]所表明的那样,人类的语言感知不仅依赖于听觉信息,还依赖于像嘴唇运动这样的视觉线索。因此,毫无疑问,视觉语言有助于人类的语言感知,特别是对于听力受损或听力困难的人,或当听觉信息被破坏时。 自动视觉语音分析(VSA)作为计算机视觉和多媒体领域的一个基础性和挑战性课题,近年来受到越来越多的关注,因为它在各种应用中发挥着重要的作用,其中许多应用是新兴的。VSA包括两个基本的密切相关的形式双重问题: 视觉语音识别(VSR)或唇读,视觉语音生成(VSG)或唇序列生成。由于近年来深度学习的蓬勃发展,这一领域已经取得了重大进展。典型的学术界和实际应用包括多模态语音识别和增强、说话人识别和验证[3]、医疗救助、安全、取证、视频压缩、娱乐、人机交互、情感理解等[4,5]。 举一些应用实例,在语音识别和增强中,可以将视觉语音作为互补信号处理,以提高当前音频语音识别和分离在各种不利声学条件下的准确性和鲁棒性[6,7,8,9]。在医学领域,解决VSR任务也可以帮助听力受损的[10]和声带病变的人。在公安领域,VSA可用于人脸伪造检测[11]和活体检测[12]。在人机交互中,视觉语音可以作为一种新型的交互信息,提高交互的多样性和鲁棒性[13,14]。在娱乐领域,VSG技术在虚拟游戏中个性化的3D说话头像生成[15],以及在电影后期如视觉配音[16]中实现高保真真实感的说话视频生成等方面发挥着至关重要的作用。此外,VSR可以用来转录无声电影档案。 VSA的核心是视觉语音表示学习和序列建模。在传统VSA方法为主的时代,视觉语音的浅层表示如visemes[17,18]、口型几何描述符[19]、线性变换特征[20]、统计表示[21]、序列建模如高斯过程动力学模型[22]、隐马尔可夫模型(hmm)[23]、决策树模型[24]被广泛应用于解决VSA任务。自从深度神经网络(DNNs)[25]在图像分类任务中取得重大突破以来,大多数计算机视觉和自然语言问题都明确地集中在深度学习方法上,包括VSA。2016年,基于深度学习的VSA方法[26,27]的表现大大超过了传统方法,使VSA进入了深度学习时代。同时,大规模VSA数据集的出现[27,28,29,30,31]推动了基于深度学习的VSA研究的进一步发展。在本文中,我们主要研究基于深度学习的VSA方法。VSA技术从2016年到现在的里程碑如图1所示,包括具有代表性的深度VSR和VSG方法以及相关的视听数据集。 图1 从2016年到现在视觉语音分析的时间里程碑,包括代表性的VSR和VSG方法,以及视听数据集。手工制作的特征工程方法一直占据着VSA的主导地位,直到2016年相关深度网络的引入才发生了转变。尽管在过去的几年中,深度学习带来了一些有希望的进展,但VSA技术仍处于早期阶段,无法满足实际应用的要求。这当然不是由于研究人员的努力不足,因为已经有许多关于VSA的优秀工作[6,28,32,33,34,35]。因此,系统地回顾该领域的最新发展,识别阻碍其发展的主要挑战和开放问题,并确定有希望的未来方向是非常重要的。然而,VSA研究的大部分仍然相当分散,没有这样的系统性综述。本综述的主要目的是全面概述当前基于深度学习的VSA方法,特别是VSR和VSG及其相关应用、主要挑战、基准数据集、方法和最先进(SOTA)结果,以及现有的差距和未来的研究方向。我们把VSR和VSG综合起来进行概述,主要有三个原因。首先,VSR和VSG作为VSA中最基本的问题,涵盖了视觉语音分析的大部分方面。其他与VSA相关的任务,如语音增强、说话人验证、人脸伪造检测等,都可以看作VSR和VSG的扩展应用。第二,由于VSR和VSG是形式化对偶的,并且相互促进,因此二元学习[36]和生成式对抗学习[37]在现有的许多VSA著作中被广泛采用[32,38,39,40,41]。因此,我们打算提供一个侧面的视角,让读者了解VSR和VSG的演变。第三,VSR和VSG具有共同的核心技术要点,如视觉语音表示学习方法和上下文序列建模方法。我们希望这将有助于读者对这些方法的跨任务可转移性有一个可理解的理解。现在我们可以总结我们在本文中的主要贡献。据我们所知,这是第一个系统全面地回顾了视觉语音分析的深度学习方法的综述论文,涵盖了两个基本问题,即视觉语音识别和视觉语音生成。针对每个问题总结了问题定义、主要挑战、基准数据集和测试协议,值得注意的是,还确定了不同VSA问题之间的关系。我们提出了一个分类法来对主要方法进行分组。此外,还分析了代表性方法的性能比较、优缺点及其内在联系。提供了该领域的开放问题和有前途的方向。
  • [技术干货] 基于华为云ModelArts深度学习算法的语音识别实践
    前言利用新型的人工智能(深度学习)算法,结合清华大学开源语音数据集THCHS30进行语音识别的实战演练,让使用者在了解语音识别基本的原理与实战的同时,更好的了解人工智能的相关内容与应用。通过这个实践可以了解如何使用Keras和Tensorflow构建DFCNN的语音识别神经网络,并且熟悉整个处理流程,包括数据预处理、模型训练、模型保存和模型预测等环节。实践流程基础环境准备OBS准备ModelArts应用开始语音识别操作开始语言模型操作1.基础环境准备在使用 ModelArts 进行 AI 开发前,需先完成以下基础操作哦(如有已完成部分,请忽略),主要分为4步(注册–>实名认证–>服务授权–>领代金券):使用手机号注册华为云账号:点击注册点此去完成实名认证,账号类型选"个人",个人认证类型推荐使用"扫码认证"。 点此进入 ModelArts 控制台数据管理页面,上方会提示访问授权,点击【服务授权】按钮,按下图顺序操作: 进入 ModelArts 控制台首页,如下图,点击页面上的"彩蛋",领取新手福利代金券!后续步骤可能会产生资源消耗费用,请务必领取。 以上操作,也提供了详细的视频教程,点此查看:ModelArts环境配置基于深度学习算法的语音识别具体步骤什么是OBS?对象存储服务(Object Storage Service,OBS)是一个基于对象的海量存储服务,为客户提供海量、安全、高可靠、低成本的数据存储能力,包括:创建、修改、删除桶,上传、下载、删除对象等。2.OBS准备1).将本地准备的data.zip和语音数据包data_thchs30.tar上传到OBS中,为后续步骤准备。创建OBS桶将光标移动至左边栏,弹出菜单中选择“服务列表”->“ 存储”->“对象存储服务 OBS”,如下图:进去对象存储服务 OBS后,点击创建桶,配置参数如下:区域:华北-北京四,数据冗余存储策略:多AZ存储,桶名称:自定义(请记录,后续使用),存储类别:标准存储,桶策略:私有,默认加密:关闭,归档数据直读:关闭,点击“立即创建”,完成创建后跳转到桶列表,如下图所示:2)创建AK/SK登录华为云,在页面右上方单击“控制台”,进入华为云管理控制台。图1 控制台入口在控制台右上角的帐户名下方,单击“我的凭证”,进入“我的凭证”页面。图2 我的凭证在“我的凭证”页面,选择“访问密钥>新增访问密钥”,如图3所示。图3 单击新增访问密钥填写该密钥的描述说明,单击“确定”。根据提示单击“立即下载”,下载密钥。图4 新增访问密钥密钥文件会直接保存到浏览器默认的下载文件夹中。打开名称为“credentials.csv”的文件,即可查看访问密钥(Access Key Id和Secret Access Key)。3).安装OBS客户端首先下载OBS工具到云服务器,在自己电脑打开命令行界面,执行如下命令:mkdir /home/user/Desktop/data; cd /home/user/Desktop/data; wget https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsutil/current/obsutil_linux_amd64.tar.gz输入解压缩指令,并查看当前目录列表:tar -zxf obsutil_linux_amd64.tar.gz; ls -l执行如下指令配置OBS工具,操作说明:自己获取的密钥的AK/SK填入-i -k参数后面执行如下查看对象列表指令,验证是否配置成功,指令如下:./obsutil ls配置成功结果如下图:4)上传语音资料执行如下指令下载实验相关资料:注:由于语音资料较大(7个多g),需要耐心等待cd ../; wget https://sandbox-experiment-resource-north-4.obs.cn-north-4.myhuaweicloud.com/speech-recognition/data.zip; wget https://sandbox-experiment-resource-north-4.obs.cn-north-4.myhuaweicloud.com/speech-recognition/data_thchs30.tar下载完毕,执行如下查看指令:ll输入以下指令,将刚刚下载好 的语音文件上传到创建的OBS桶nlpdemo中:./obsutil_linux_amd64_5.*/obsutil cp ./data.zip obs://nlpdemo; ./obsutil_linux_amd64_5.*/obsutil cp ./data_thchs30.tar obs://nlpdemo上传完毕后【大约60分钟,上传的速率较慢】建议华为云优化一下OBS的上传速度,在华为云控制台依次选择“控制台”->“服务列表”->“ 存储”->“对象存储服务OBS”,进入服务界面,点击创建的桶名称nlpdemo进入详情页,于页面左侧选择“对象”,点击后于页面右侧可查看到刚传入的资料,2.ModelArts应用什么是ModelArts?ModelArts是面向AI开发者的一站式开发平台,提供海量数据预处理及半自动化标注、大规模分布式训练、自动化模型生成及端-边-云模型按需部署能力,帮助用户快速创建和部署模型,管理全周期AI工作流。1) 创建Notebook在服务列表中找到并进入人工智能服务 ModelArts,然后点击ModelArts 页面中左侧的【开发环境】选项一点击【notebook】 进入notebook 页面。点击【创建】按钮进入创建页面,并按以下参数进行配置:名称:自定义,自动停止:自定义 12小时(在选择非[限时免费]规格后显示),镜像:公共镜像:在第二页选择tensorflow1.13-cuda10.0-cudnn7-ubuntu18.0.4-GPU算法开发和训练基础镜像,预置AI引擎Tensorflow1.13.1,资源池:公共资源池,类型:CPU,规格:8核64GiB,存储配置:云硬盘(30GB)。点击“下一步”->“提交”->“返回Notebook列表”,Notebook列表如下图所示:注:大约3分钟后状态由“启动中”变为“运行中”,可点击列表右上角的“刷新”查看最新状态。3.开始语音识别操作采用CNN+CTC的方式进行语音识别。1)导入包创建成功,返回NoteBook列表,等待状态变为“运行中”【约等待3分钟】,点击“打开”,进入NoteBook详情页。在页面中选择“TensorFlow-1.13.1”,如下图所示:在新建的Python环境页面的输入框中,输入以下代码:import moxing as mox import numpy as np import scipy.io.wavfile as wav from scipy.fftpack import fft import matplotlib.pyplot as plt %matplotlib inline import keras from keras.layers import Input, Conv2D, BatchNormalization, MaxPooling2D from keras.layers import Reshape, Dense, Lambda from keras.optimizers import Adam from keras import backend as K from keras.models import Model from keras.utils import multi_gpu_model import os import pickle点击“代码旁边的小三角形”run,查看执行结果,如下图:2)数据准备继续在下方空白的输入框中输入以下代码,从上传到OBS的数据拷贝到当前目录:注:下方框选的部分是之前创建的OBS桶名点击“run”,查看执行结果,如下图:current_path = os.getcwd() mox.file.copy('s3://nlpdemo/data.zip', current_path+'/data.zip') mox.file.copy('s3://nlpdemo/data_thchs30.tar', current_path+'/data_thchs30.tar')继续在下方空白的输入框中输入以下代码,解压缩数据:!unzip data.zip !tar -xvf data_thchs30.tar点击“run”,查看执行结果,如下图:3)数据处理继续在下方空白的输入框中输入以下代码,生成音频文件和标签文件列表:注:考虑神经网络训练过程中接收的输入输出。首先需要batch_size内数据具有统一的shape。格式为:[batch_size, time_step, feature_dim],然而读取的每一个sample的时间轴长都不一样,所以需要对时间轴进行处理,选择batch内最长的那个时间为基准,进行padding。这样一个batch内的数据都相同,就可以进行并行训练了。source_file = 'data/thchs_train.txt' def source_get(source_file): train_file = source_file label_data = [] wav_lst = [] with open(train_file,"r",encoding="utf-8") as f: lines = f.readlines() for line in lines: datas = line.split("\t") wav_lst.append(datas[0]) label_data.append(datas[1]) return label_data, wav_lst label_data, wav_lst = source_get(source_file) print(label_data[:10]) print(wav_lst[:10])点击“run”,查看执行结果,如下图:继续在下方空白的输入框中输入以下代码,进行label数据处理(为label建立拼音到id的映射,即词典):def mk_vocab(label_data): vocab = [] for line in label_data: line = line.split(' ') for pny in line: if pny not in vocab: vocab.append(pny) vocab.append('_') return vocab vocab = mk_vocab(label_data) def word2id(line, vocab): return [vocab.index(pny) for pny in line.split(' ')] label_id = word2id(label_data[0], vocab) print(label_data[0]) print(label_id)点击“run”,查看执行结果,如下图:继续在下方空白的输入框中输入以下代码,进行音频数据处理:def compute_fbank(file): x=np.linspace(0, 400 - 1, 400, dtype = np.int64) w = 0.54 - 0.46 * np.cos(2 * np.pi * (x) / (400 - 1) ) fs, wavsignal = wav.read(file) time_window = 25 window_length = fs / 1000 * time_window wav_arr = np.array(wavsignal) wav_length = len(wavsignal) range0_end = int(len(wavsignal)/fs*1000 - time_window) // 10 data_input = np.zeros((range0_end, 200), dtype = np.float) data_line = np.zeros((1, 400), dtype = np.float) for i in range(0, range0_end): p_start = i * 160 p_end = p_start + 400 data_line = wav_arr[p_start:p_end] data_line = data_line * w data_line = np.abs(fft(data_line)) data_input[i]=data_line[0:200] data_input = np.log(data_input + 1) #data_input = data_input[::] return data_input fbank = compute_fbank(wav_lst[0]) print(fbank.shape)点击“run”,查看执行结果,如下图:继续在下方空白的输入框中输入以下代码,生成数据生成器:total_nums = 10000 batch_size = 4 batch_num = total_nums // batch_size from random import shuffle shuffle_list = list(range(10000)) shuffle(shuffle_list) def get_batch(batch_size, shuffle_list, wav_lst, label_data, vocab): for i in range(10000//batch_size): wav_data_lst = [] label_data_lst = [] begin = i * batch_size end = begin + batch_size sub_list = shuffle_list[begin:end] for index in sub_list: fbank = compute_fbank(wav_lst[index]) fbank = fbank[:fbank.shape[0] // 8 * 8, :] label = word2id(label_data[index], vocab) wav_data_lst.append(fbank) label_data_lst.append(label) yield wav_data_lst, label_data_lst batch = get_batch(4, shuffle_list, wav_lst, label_data, vocab) wav_data_lst, label_data_lst = next(batch) for wav_data in wav_data_lst: print(wav_data.shape) for label_data in label_data_lst: print(label_data) lens = [len(wav) for wav in wav_data_lst] print(max(lens)) print(lens) def wav_padding(wav_data_lst): wav_lens = [len(data) for data in wav_data_lst] wav_max_len = max(wav_lens) wav_lens = np.array([leng//8 for leng in wav_lens]) new_wav_data_lst = np.zeros((len(wav_data_lst), wav_max_len, 200, 1)) for i in range(len(wav_data_lst)): new_wav_data_lst[i, :wav_data_lst[i].shape[0], :, 0] = wav_data_lst[i] return new_wav_data_lst, wav_lens pad_wav_data_lst, wav_lens = wav_padding(wav_data_lst) print(pad_wav_data_lst.shape) print(wav_lens) def label_padding(label_data_lst): label_lens = np.array([len(label) for label in label_data_lst]) max_label_len = max(label_lens) new_label_data_lst = np.zeros((len(label_data_lst), max_label_len)) for i in range(len(label_data_lst)): new_label_data_lst[i][:len(label_data_lst[i])] = label_data_lst[i] return new_label_data_lst, label_lens pad_label_data_lst, label_lens = label_padding(label_data_lst) print(pad_label_data_lst.shape) print(label_lens)代码执行成功,如下图:执行结果输出如下图:继续在下方空白的输入框中输入以下代码,点击“run”运行,生成用于训练格式的数据生成器(此段代码无输出):4)模型搭建继续输入以下代码:说明:训练输入为时频图,标签为对应的拼音标签,搭建语音识别模型,采用了 CNN+CTC 的结构。def conv2d(size): return Conv2D(size, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal') def norm(x): return BatchNormalization(axis=-1)(x) def maxpool(x): return MaxPooling2D(pool_size=(2,2), strides=None, padding="valid")(x) def dense(units, activation="relu"): return Dense(units, activation=activation, use_bias=True, kernel_initializer='he_normal') def cnn_cell(size, x, pool=True): x = norm(conv2d(size)(x)) x = norm(conv2d(size)(x)) if pool: x = maxpool(x) return x def ctc_lambda(args): labels, y_pred, input_length, label_length = args y_pred = y_pred[:, :, :] return K.ctc_batch_cost(labels, y_pred, input_length, label_length) class Amodel(): """docstring for Amodel.""" def __init__(self, vocab_size): super(Amodel, self).__init__() self.vocab_size = vocab_size self._model_init() self._ctc_init() self.opt_init() def _model_init(self): self.inputs = Input(name='the_inputs', shape=(None, 200, 1)) self.h1 = cnn_cell(32, self.inputs) self.h2 = cnn_cell(64, self.h1) self.h3 = cnn_cell(128, self.h2) self.h4 = cnn_cell(128, self.h3, pool=False) # 200 / 8 * 128 = 3200 self.h6 = Reshape((-1, 3200))(self.h4) self.h7 = dense(256)(self.h6) self.outputs = dense(self.vocab_size, activation='softmax')(self.h7) self.model = Model(inputs=self.inputs, outputs=self.outputs) def _ctc_init(self): self.labels = Input(name='the_labels', shape=[None], dtype='float32') self.input_length = Input(name='input_length', shape=[1], dtype='int64') self.label_length = Input(name='label_length', shape=[1], dtype='int64') self.loss_out = Lambda(ctc_lambda, output_shape=(1,), name='ctc')\ ([self.labels, self.outputs, self.input_length, self.label_length]) self.ctc_model = Model(inputs=[self.labels, self.inputs, self.input_length, self.label_length], outputs=self.loss_out) def opt_init(self): opt = Adam(lr = 0.0008, beta_1 = 0.9, beta_2 = 0.999, decay = 0.01, epsilon = 10e-8) #self.ctc_model=multi_gpu_model(self.ctc_model,gpus=2) self.ctc_model.compile(loss={'ctc': lambda y_true, output: output}, optimizer=opt) am = Amodel(len(vocab)) am.ctc_model.summary()点击“run”,执行结果如下图:5)训练模型 继续输入以下代码创建语音识别模型:total_nums = 100 batch_size = 20 batch_num = total_nums // batch_size epochs = 8 source_file = 'data/thchs_train.txt' label_data,wav_lst = source_get(source_file) vocab = mk_vocab(label_data) vocab_size = len(vocab) print(vocab_size) shuffle_list = list(range(100)) am = Amodel(vocab_size) for k in range(epochs): print('this is the', k+1, 'th epochs trainning !!!') #shuffle(shuffle_list) batch = data_generator(batch_size, shuffle_list, wav_lst, label_data, vocab) am.ctc_model.fit_generator(batch, steps_per_epoch=batch_num, epochs=1)执行结果如下图【大约需要11分钟,如果需要更好效果可以调整参数epochs为50次】:)6)保存模型将训练模型保存到OBS中。继续输入如下代码(此段代码无输出):操作说明:用创建的OBS桶名填写参数am.model.save("asr-model.h5") with open("vocab","wb") as fw: pickle.dump(vocab,fw) mox.file.copy("asr-model.h5", 's3://nlpdemo/asr-model.h5') mox.file.copy("vocab", 's3://nlpdemo/vocab')7)测试模型继续输入如下代码,点击“run”运行,用以导入包及加载模型和数据(此段代码无输出):#导入包 import pickle from keras.models import load_model import os import tensorflow as tf from keras import backend as K import numpy as np import scipy.io.wavfile as wav from scipy.fftpack import fft #加载模型和数据 bm = load_model("asr-model.h5") with open("vocab","rb") as fr: vocab_for_test = pickle.load(fr)继续输入如下代码,点击“run”运行,获取测试数据(此段代码无输出):def wav_padding(wav_data_lst): wav_lens = [len(data) for data in wav_data_lst] wav_max_len = max(wav_lens) wav_lens = np.array([leng//8 for leng in wav_lens]) new_wav_data_lst = np.zeros((len(wav_data_lst), wav_max_len, 200, 1)) for i in range(len(wav_data_lst)): new_wav_data_lst[i, :wav_data_lst[i].shape[0], :, 0] = wav_data_lst[i] return new_wav_data_lst, wav_lens #获取信号的时频图 def compute_fbank(file): x=np.linspace(0, 400 - 1, 400, dtype = np.int64) w = 0.54 - 0.46 * np.cos(2 * np.pi * (x) / (400 - 1) ) # 汉明窗 fs, wavsignal = wav.read(file) # wav波形 加时间窗以及时移10ms time_window = 25 # 单位ms window_length = fs / 1000 * time_window # 计算窗长度的公式,目前全部为400固定值 wav_arr = np.array(wavsignal) wav_length = len(wavsignal) range0_end = int(len(wavsignal)/fs*1000 - time_window) // 10 # 计算循环终止的位置,也就是最终生成的窗数 data_input = np.zeros((range0_end, 200), dtype = np.float) # 用于存放最终的频率特征数据 data_line = np.zeros((1, 400), dtype = np.float) for i in range(0, range0_end): p_start = i * 160 p_end = p_start + 400 data_line = wav_arr[p_start:p_end] data_line = data_line * w # 加窗 data_line = np.abs(fft(data_line)) data_input[i]=data_line[0:200] # 设置为400除以2的值(即200)是取一半数据,因为是对称的 data_input = np.log(data_input + 1) #data_input = data_input[::] return data_input def test_data_generator(test_path): test_file_list = [] for root, dirs, files in os.walk(test_path): for file in files: if file.endswith(".wav"): test_file = os.sep.join([root, file]) test_file_list.append(test_file) print(len(test_file_list)) for file in test_file_list: fbank = compute_fbank(file) pad_fbank = np.zeros((fbank.shape[0]//8*8+8, fbank.shape[1])) pad_fbank[:fbank.shape[0], :] = fbank test_data_list = [] test_data_list.append(pad_fbank) pad_wav_data, input_length = wav_padding(test_data_list) yield pad_wav_data test_path ="data_thchs30/test" test_data = test_data_generator(test_path)继续输入以下代码进行测试:def decode_ctc(num_result, num2word): result = num_result[:, :, :] in_len = np.zeros((1), dtype = np.int32) in_len[0] = result.shape[1]; r = K.ctc_decode(result, in_len, greedy = True, beam_width=10, top_paths=1) r1 = K.get_value(r[0][0]) r1 = r1[0] text = [] for i in r1: text.append(num2word[i]) return r1, text for i in range(10): #获取测试数据 x = next(test_data) #载入训练好的模型,并进行识别语音 result = bm.predict(x, steps=1) #将数字结果转化为拼音结果 _, text = decode_ctc(result, vocab_for_test) print('文本结果:', text)点击“run”,执行成功如下图所示:.4.开始语言模型操作训练语言模型是采用捕捉特征能力更强的Transformer,创建基于自注意力机制的语言模型,在实验的过程中会跟大家介绍具体的实现步骤。1)导入包继续输入如下代码,点击“run”运行,导入相关包(此段代码无输出):from tqdm import tqdm import tensorflow as tf import moxing as mox import numpy as np2)数据处理继续输入如下代码,点击“run”运行:with open("data/zh.tsv", 'r', encoding='utf-8') as fout: data = fout.readlines()[:10000] inputs = [] labels = [] for i in tqdm(range(len(data))): key, pny, hanzi = data[i].split('\t') inputs.append(pny.split(' ')) labels.append(hanzi.strip('\n').split(' ')) print(inputs[:5]) print() print(labels[:5]) def get_vocab(data): vocab = ['<PAD>'] for line in tqdm(data): for char in line: if char not in vocab: vocab.append(char) return vocab pny2id = get_vocab(inputs) han2id = get_vocab(labels) print(pny2id[:10]) print(han2id[:10]) input_num = [[pny2id.index(pny) for pny in line] for line in tqdm(inputs)] label_num = [[han2id.index(han) for han in line] for line in tqdm(labels)] #获取batch数据 def get_batch(input_data, label_data, batch_size): batch_num = len(input_data) // batch_size for k in range(batch_num): begin = k * batch_size end = begin + batch_size input_batch = input_data[begin:end] label_batch = label_data[begin:end] max_len = max([len(line) for line in input_batch]) input_batch = np.array([line + [0] * (max_len - len(line)) for line in input_batch]) label_batch = np.array([line + [0] * (max_len - len(line)) for line in label_batch]) yield input_batch, label_batch batch = get_batch(input_num, label_num, 4) input_batch, label_batch = next(batch) print(input_batch) print(label_batch)执行成功结果如下图:3)模型搭建模型采用self-attention的左侧编码器,如下图:继续输入如下代码,点击“run”运行,用以实现图片结构中的layer norm层(代码无输出):#layer norm层 def normalize(inputs, epsilon = 1e-8, scope="ln", reuse=None): with tf.variable_scope(scope, reuse=reuse): inputs_shape = inputs.get_shape() params_shape = inputs_shape[-1:] mean, variance = tf.nn.moments(inputs, [-1], keep_dims=True) beta= tf.Variable(tf.zeros(params_shape)) gamma = tf.Variable(tf.ones(params_shape)) normalized = (inputs - mean) / ( (variance + epsilon) ** (.5) ) outputs = gamma * normalized + beta return outputs继续输入如下代码,点击“run”运行,以实现图片结构中的embedding层(代码无输出):def embedding(inputs, vocab_size, num_units, zero_pad=True, scale=True, scope="embedding", reuse=None): with tf.variable_scope(scope, reuse=reuse): lookup_table = tf.get_variable('lookup_table', dtype=tf.float32, shape=[vocab_size, num_units], initializer=tf.contrib.layers.xavier_initializer()) if zero_pad: lookup_table = tf.concat((tf.zeros(shape=[1, num_units]), lookup_table[1:, :]), 0) outputs = tf.nn.embedding_lookup(lookup_table, inputs) if scale: outputs = outputs * (num_units ** 0.5) return outputs继续输入如下代码,点击“run”运行,以实现multihead层(此段代码无输出):继续输入如下代码,点击“run”运行,以实现feedforward层(此段代码无输出):继续输入如下代码,点击“run”运行,以搭建模型(此段代码无输出):4) 训练模型继续输入如下代码,点击“run”运行,用于参数设定(此段代码无输出):继续输入以下代码,点击“run”运行,用于模型训练:import os epochs = 3 batch_size = 4 g = Graph(arg) saver =tf.train.Saver() with tf.Session() as sess: merged = tf.summary.merge_all() sess.run(tf.global_variables_initializer()) if os.path.exists('logs/model.meta'): saver.restore(sess, 'logs/model') writer = tf.summary.FileWriter('tensorboard/lm', tf.get_default_graph()) for k in range(epochs): total_loss = 0 batch_num = len(input_num) // batch_size batch = get_batch(input_num, label_num, batch_size) for i in range(batch_num): input_batch, label_batch = next(batch) feed = {g.x: input_batch, g.y: label_batch} cost,_ = sess.run([g.mean_loss,g.train_op], feed_dict=feed) total_loss += cost if (k * batch_num + i) % 10 == 0: rs=sess.run(merged, feed_dict=feed) writer.add_summary(rs, k * batch_num + i) print('epochs', k+1, ': average loss = ', total_loss/batch_num) saver.save(sess, 'logs/model') writer.close()执行成功输出内容如下图【大约10分钟执行完成,如果需要更好效果请将参数epochs调整为15】:5) 模型测试继续输入如下代码,进行拼音测试:arg.is_training = False g = Graph(arg) saver =tf.train.Saver() with tf.Session() as sess: saver.restore(sess, 'logs/model') while True: line = input('Input Test Content: ') if line == 'exit': break line = line.strip('\n').split(' ') x = np.array([pny2id.index(pny) for pny in line]) x = x.reshape(1, -1) preds = sess.run(g.preds, {g.x: x}) got = ''.join(han2id[idx] for idx in preds[0]) print(got)点击“run”运行后,出现输入框提示输入,如下图:我输入以下拼音nian2 de bu4 bu4 ge4 de shang4 shi2 qu1 pei4 wai4 gu4 de nian2 ming2 de zi4 ren2 na4 ren2 bu4 zuo4 de jia1 zhong4 shi2 wei4 yu4 you3 ta1 yang2 mu4 yu4 ci3单击键盘回车键后,模型返回中文内容,如下图:继续在输入框中输入“exit”,回车后出现提示停止运行,如下图:6) 保存模型继续输入如下代码,点击“run”运行后,保存模型到OBS桶中,方便其他notebook使用:操作说明:用自己创建的OBS桶名代替“OBS”字符,我的是nlpdemo!zip -r languageModel.zip logs #递归压缩模型所在文件夹 mox.file.copy("languageModel.zip", 's3://nlpdemo/languageModel.zip')至此基于深度学习算法的语音识别实践全部完成,整个流程下来体验还是很不错的!总结整个流程用到了很多的华为云服务,例如OBS和ModelArts的NoteBook,功能非常强大,体验感很好,对深度学习算法的语音识别有了一定的了解,也对整个实践的过程有了认识,欢迎大家一起在华为云社区交流学习。如有不当之处,欢迎指正!感恩能与大家在华为云遇见!希望能与大家一起在华为云社区共同成长。
  • [行业资讯] 如何确保智能家居不会危及数据隐私?
    导读:去年智能音箱市场的价值为50.8亿美元,预计到2027年将达到219.4亿美元。随着越来越多的人购买智能家居和设备的激增,数据安全和隐私方面的代价会越来越大。智能家居已经被大肆宣传了很长一段时间,但公平地说,智能家居时代现在真的到来了。这种地位几乎完全是由智能音箱的兴起推动的——这是第一个真正面向大众市场的智能家居设备。IMARCGroup的数据显示,去年智能音箱市场的价值为50.8亿美元,预计到2027年将达到219.4亿美元。如此广泛的应用,为未来的智能家居奠定了基础。人们已经对语音控制/交互表现出高度的信任。然而,随着越来越多的人购买智能家居和设备的激增,数据安全和隐私方面的代价会越来越大。便利与隐私之间的平衡换句话说,Alexa关灯时可能会有所帮助,但对云的永久链接的依赖意味着,从隐私的角度来看,其也将后门打开。这不仅仅是一个技术事实,也是一个道德问题。对于设备而言,监听特定的唤醒词是很方便。但消费者主要担心的是,他们家里的每一个声音事件都被捕捉、数字化并传输到云端。当然,这种机制不仅仅是出于技术上的需要——其也在推动亚马逊、谷歌和其他公司基于广告的商业模式。然而,这最终可能会弄巧成拙。如果消费者对数据隐私的担忧无法得到解决,那么智能家居市场的上限就会低得多——不仅是对于现今的智能音箱,还有未来的任何设备。这意味着,如果智能家居要真正蓬勃发展,还需要找到一种技术平衡。如果没有识别人和响应命令的能力,就很难看出智能家居的“用途”。与此同时,我们必须避免让人们觉得自己在家里一直处于监视之下的情况。如何找到这种平衡,是目前智能家居行业最重要的问题。进入边缘人工智能实现更私人化的智能家居的关键是让设备本身更智能。电视、条形音箱、智能音箱甚至远程医疗监控设备都有一个共同点——都希望变得“更智能”。但目前唯一的方法是通过云。给智能音箱的命令和信号不被设备处理,相反,数据被传输到云进行解释、情境化,然后将指令和动作发送回说话者。基于云的物联网还有另一种选择——人工智能物联网(AIoT)。AIoT模型包括将智能和处理能力直接放在终端设备中——使设备本身能够在本地解释和执行命令——切断与云的连接。问题在于,提供这种边缘智能说起来容易做起来难。迄今为止,能够提供这种智能的芯片价格昂贵,操作困难,且设计到产品中非常耗时。交付AIoT毫无疑问,AIoT的芯片设计挑战是巨大的。要结束对云的依赖,就需要一种全新的处理器,能将AI、DSP、控制和I/O集成在一个设备中,且具有足够多的功能,让设计师能够确定这四种之间的平衡。所有这些都必须在一个小包装中交付,并以较低的总体BOM成本。创造这样一个具有快速处理和神经网络能力的无限可编程设备并非易事。但这对智能家居隐私至关重要。其可以使收集到的信息在本地处理,同时保证个人数据的安全,并几乎立即执行行动。还值得注意的是,在网络边缘免费提供这种智能,将使向智能家庭设备添加更复杂的功能成为可能。借助新型处理器,可以将存在检测、面部和图像识别,甚至生命体征监控添加到设备中,获取丰富的上下文数据,以在闭环系统内建立对操作环境的智能理解,而无需云,甚至,没有将数据暴露给云。当然,切断与云的连接并不是安全智能家居设备的唯一要求。包括安全启动、一次性可编程密钥存储、真正的随机数生成和自定义安全指令在内的高级安全功能,对于保护消费者数据也至关重要。智能家居的安全和隐私是不容置疑的让设备能够本地处理数据,并对基于本地人工智能的结果做出反应,将代表着数据隐私方面的巨大进步。有一种观点认为,与目前基于云计算的系统所支持的个性化和用户体验相比,这将是一种太大的权衡。但是,提供智能家居服务并不需要个人信息。由边缘人工智能(edgeAI)实现的视觉和音频传感器能够识别儿童和父母的声音,使设备能够忽略儿童发出的打开烤箱或订购受年龄限制的物品的命令。随着时间的推移,这些功能可以扩展到启用非常复杂的功能,而无需将任何个人身份信息传输到云。例如,视觉和声音传感器可以协同工作,观察有人在跌倒时受伤的房间,从而向紧急服务部门发出警报。要实现这种更复杂的智能家居愿景,需要具备智能的设备和能够绘制该图片的集体传感器阵列。向隐私的转变,以及将人工智能传感器优先于数据收集,是实现这一版本的智能家居的绝对关键的先决条件。转载自http://www.iotworld.com.cn/html/News/202205/70c464986a0af82a.shtml
  • [其他] 药物结合结构预测的几何深度学习
    预测类药物分子如何结合到特定的蛋白质目标是药物发现的核心问题。一种极其快速的计算绑定方法将使快速虚拟筛选或药物工程等关键应用成为可能。现有方法的计算成本很高,因为它们依赖于大量的候选样本,并结合了评分、排名和微调步骤。我们用一种SE(3)-等变几何深度学习模型EQUIBIND挑战这一范式,该模型可以直接预测i)受体结合位置(盲对接)和 ii)配体结合姿势和方向。与传统和最近的基线相比,EquiBind实现了显著的加速和更好的质量。此外,我们还展示了在以增加运行时间为代价将其与现有的微调技术结合使用时的额外改进。最后,我们提出了一种新颖的、快速的微调模型,该模型根据给定输入原子点云的von Mises角距离的封闭全局极小值来调整配体旋转键的扭转角,避免了先前昂贵的能量最小化差分进化策略。https://www.zhuanzhi.ai/paper/7e1cc60c20e48a58c627b1779b77c957
  • [技术干货] 【论文分享】基于IR-VGG的多分类皮fu病实时诊断
    基于IR-VGG的多分类皮fu病实时诊断谈玲1, 荣杉山1, 夏景明2, SajibSarker2, 马雯杰11 南京信息工程大学计算机与软件学院,江苏 南京 2100442 南京信息工程大学人工智能学院,江苏 南京 2100443 南京信息工程大学雷丁学院,江苏 南京 210044摘要恶性的皮肤病变在早期阶段的治愈率极高,基于深度学习的皮肤病诊断研究近年来受到持续关注,其诊断准确率较高,然而计算资源消耗大,且依赖于医院大型计算设备。为在物联网移动设备上实现快速准确皮肤病诊断,提出一种基于IR-VGG(inverted residual visual geometry group)的多分类皮肤病实时诊断系统,使用轮廓检测算法分割出皮肤病图像病灶区域,并用反转残差块替换 VGG16 第一层卷积块以降低网络参数权重和内存开销;将原图像和分割后的病灶图像输入IR-VGG网络,通过全局和局部特征提取后,输出皮肤病诊断结果。实验结果表明,IR-VGG网络结构在SkinData-1和SkinData-2皮肤病数据集上的准确率分别可达到94.71%和85.28%,并且可以有效降低复杂度,使诊断系统较容易在物联网移动设备上进行皮肤病实时诊断。关键词: 皮肤病 ; 边缘检测分割 ; 反转残差块 ; 深度学习 ; 物联网移动设备1 引言皮肤恶性病变大概率会发生癌变。早期诊断和治疗癌前皮肤病变可以较好地预防癌症的发生。世界卫生组织(WHO, World Health Organization)的统计数据表明,全球每年发生200万至300万例非黑色素瘤皮肤癌和132万例黑色素瘤皮肤癌[1-2]。一般来说,皮肤病变的诊断需要经验丰富的皮肤科专家对病变图像进行细致的人工检查。随着物联网的发展,人体传感器网络、人工智能、云计算和无线网络通信让认知医疗服务、远程健康监控、健康指导和反馈可以通过多种传感器进行数据融合帮助实现。本文提出一种基于计算机视觉技术的皮肤病实时诊断系统,该系统资源消耗较少,便于移植到移动设备上,患者可通过手机等智能设备实现皮肤病初诊,从而为皮肤病患者提供快捷可靠的物联网化公共医疗服务奠定了基础。传统的病灶检测方法主要靠人工的ABCDE规则(不对称、边界、颜色、皮镜结构和进化)[3]、3点检查表[4]、7 点检查表[5]、Menzies方法[6]和CASH (颜色、建筑、对称、均匀)[7]特征等方法进行特征提取。近年来,计算机视觉在物联网医疗服务和医学影像智能诊断中开始获得应用。其自主检测病变的优势减少了对皮肤科医生的依赖。基于图像处理的皮肤病诊断包括:图像输入、病灶点特征提取和特征分类3部分。目前许多算法提出了自动皮镜图像分析。文献[8,9,10,11]全面总结了过去几十年的相关工作。总的来说,用计算机辅助分析模型通常包括以下4个步骤:1) 图像预处理,如去除毛发[12,13,14]和图像增强[15-16];2) 边界检测或分割[17];3) 特征提取,即颜色、纹理、边界梯度、形状相关描述符[17-19];4) 分类,如k-近邻(KNN, k-nearest neighbor)分类算法[18]、支持向量机(SVM, support vector machine)[17], AdaBoost分类器[20]等。现有的研究大多是进行特征提取工程和分类,并且假设输入图像中包含一个完整的、大小合适的病灶图像[19]。但是皮肤镜图像有时无法捕获整个病灶区域,或病灶区域只占图像的一小部分。一些研究建议使用BOF(bag-of-feature)图像检索算法在复杂情况下检测局部病变特征[20]。尽管BOF图像检索算法中的特征编码如基本直方图[21]、VLAD(vector of local aggregated descriptors)[22]特征方法和FV(fisher vector)[23]已经广泛应用于多图像分类任务中[24]。但是这种手动提取特征的方式只能有限提高分类性能,此外这些方法复杂烦琐的操作步骤使其不适用于临床实践。与手工提取特征不同,卷积神经网络(CNN, convolutional neural network)近来在图像识别领域中占据了主导地位[25,26,27,28]。卷积神经网络的主要优势在于其可靠的视觉表示能力,能对给定的训练数据集进行识别和检测[29],Jayalakshmi等[30]在卷积神经网络中加入批标准化操作,减小了模型的过拟合,在皮肤损伤图像的二分类中获得较好的分类效果,对国际皮肤影像协作组织(ISIC, International Skin Imaging Collaboration)的良性和恶性皮肤损伤的识别精度达到89.3%。胡海根等[31]通过掩盖的数据增强与深度卷积残差网络相结合的集成分类方法对黑色素瘤的诊断进行预测,通过随机和非随机掩盖的数据增强法增加了训练数据集的数量,但是对提取病灶区域的关键信息意义不大,精度为86.7%。Yu 等[32]提出用于分割的全卷积神经网络和用于分类的深度残差网络,识别精度达到85.5%。Mahbod等[33]通过多尺度、多网络集成的迁移学习对皮肤损伤分类,该方法分别以多个尺寸作为网络特征输入,由3个网络通道作为特征提取器,最后获得分类结果,该方法仅通过少量的皮肤损伤图片的训练便可得到较好的分类效果。李航等[34]通过迁移学习将预训练的 ResNet-152 的残差神经网络用来提取皮肤病变的深度卷积层特征,然后利用 SVM 对提取的黑色素瘤特征进行分类。Guha 等[35]使用自定义的卷积神经网络和 VGG16 进行迁移学习对多种皮肤疾病进行分类,与直接使用卷积神经网络架构相比,该方法识别准确率更高。Chen 等[36]在云服务器端进行自主的深度学习,构建了一个基于深度学习的全方位皮肤病识别系统。上述皮肤病分类模型虽然在准确率方面达到了较高水平,但其权重参数都非常大。上述模型也难以在高分辨率图像上达到实时的诊断速度,所以在计算资源和内存资源受限的移动设备上难以应用,也不适用于移动公共医疗服务。解决这一问题不仅要保证皮肤病诊断的准确率,还需要减少计算资源消耗,加快计算速率,这对皮肤病诊断模型提出了极高的要求。为此本文设计了一个可以在移动端设备上运行的基于IR-VGG 的多分类皮肤病实时诊断系统,本文主要贡献如下。1) 对皮肤病图片进行轮廓检测和分割,筛除图片噪声。2) 将分割后的图片和原图片同时输入特征提取器,分别提取病灶区域局部特征和皮肤病图像的全局特征,以此提升诊断模型的精准性和鲁棒性。3) 提出IR-VGG,利用反转残差块在特征提取初期减少网络参数量,保留大量特征信息。4) 使用 TensorFlow Lite 框架将皮肤病分类模型移植到Android系统的移动设备上运行。本文所提出的皮肤病诊断系统结合边缘检测分割算法和IR-VGG网络结构,一方面,通过提取全局和局部特征进行分析,提高诊断模型在皮肤疾病分类中的性能,降低医疗诊断的误诊概率;另一方面,引入反转残差块改进 VGG16 网络结构,降低诊断模型的算法复杂度,保证医疗服务在移动设备上运行的实时性。2 结束语为解决传统皮肤病诊断计算资源消耗大、实时性差的问题,提高公共医疗服务质量,实现数据共享互联的物联网医疗服务体系,本文提出一种基于IR-VGG 的多分类皮肤病实时诊断系统。在传统的VGG16分类算法中,引入反转残差块、边缘检测分割、全局和局部特征提取,不仅实现了皮肤病诊断准确率的提升,而且其网络的参数量比 VGG16 降低了90%。在数据集SkinData-1、SkinData-2上进行的实验结果表明,本文所提模型的准确率分别为94.71%、85.28%,比VGG16提升了9.69%、5.61%,而本文模型所消耗的计算资源仅为VGG16的1/10。表明本文模型在计算资源有限和实时性要求较高情况下,可以有效解决皮肤病实时诊断问题,为提高公共医疗服务质量提供了一种可行的解决方案。同时展望之后可以建立算力更充足的物联网计算基站,本文的计算设备作为边缘子节点,将采集的数据和初诊结果上传至物联网计算基站进行数据挖掘和分析,从而形成完备的物联网医疗服务体系。3 原文链接http://www.infocomm-journal.com/wlw/article/2021/2096-3750/2096-3750-5-3-00115.shtml
  • [其他] 机器学习以及深度学习
    所谓“ 机器学习” , 是指利用算法使计算机能够像人一样从数据中挖掘出信息; 而“ 深度学习”作为“机器学习”的一个**子集**, 相比其他学习方法, 使用了更多的参数、模型也更复杂, 从而使得模型对数据的理解更加深人, 也更加智能。 传统机器学习是分步骤来进行的, 每一步的最优解不一定带来结果的最优解; 另一方面, 手工选取特征是一种费时费力且需要专业知识的方法, 很大程度上依赖经验和运气。 而深度学习是从原始特征出发, 自动学习高级特征组合, 整个过程是端到端的, 直接保证最终输出的是最优解。但中间的隐层是一个黑箱, 我们并不知道机器提取出了什么特征 。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/17/1652777450611952644.png)
  • [其他] 人工智能为何能再度兴起?
    我们知道人工智能的概念在半个多世纪前的就已经提出了,历史上经历了几起几落。那么在目前阶段为什么能够兴起呢? 人工智能再度兴起并非偶然。本轮人工智能之所以能蓬勃发展, 源于我们有了足够海量的数据、强大的计算资源以及更先进的算法。新一代的变化出现了重要的特征: 基于大数据的深度学习。2006 年**深度学习( 深度神经网络) 基本理论框架**得到了验证, 从而使得人工智能开启了新一轮的繁荣。2010 年率先在语音、自然语言处理领域取得突破。自2011年深度学习在图像识别领域的准确率超过人类后, **这类算法在各个领域大放异彩**。产业界谈论的人工智能对各行各业的改变, 也无不围绕着深度学习及其相关的一系列数据处理技术。
  • [技术干货] 华为云GaussDB(for Influx)揭秘第九期:最佳实践之数据直方图
    1.   背景随着5G和IOT的快速发展,面对爆发式增长的时序数据,如何才能挖掘数据中的潜在价值,为客户的业务运行、商业决策提供精确的指导?在统计学中,直方图作为一种经典的分析工具,可以直观地描述数据分布特征,应用场景极其广泛,例如:在网络监控数据方面,通过直方图可以捕捉异常数据的分布区间,便于网络的自诊断与修复;在时序数据分析方面,通过直方图可以表示数据的分布特征,便于时序数据的特征提取;作为代价评估模型的输入从而指导数据库内部的查询优化;本文带您了解直方图在不同产品中的实现,以及GaussDB(for Influx)中直方图的使用方法。2.   直方图的实现方式时序及分析性数据库大部分都支持了直方图算子,但各个数据库中的直方图实现上也有一定差异,其中几种比较典型的直方图实现有:Druid:Druid-histogram拓展中提供了近似直方图(approximate histogram aggregator)和固定桶直方图(fixed buckets histogram)聚合器。其中近似直方图根据论文《A Streaming Parallel Decision Tree Algorithm》实现,较适用于随机分布的数据。ClickHouse:ClickHouse提供了自适应直方图,查询的结果为近似值。与Druid类似,其实现参考了论文《A Streaming Parallel Decision Tree Algorithm》。当新数据输入到直方图时,直方图中桶的边界会被调整,通常情况下,桶的宽度并不相等。 ElasticSearch:ElasticSearch中支持了HDR Histogram(High Dynamic Range Histogram),HDR Histogram是一种替代实现,在计算网络延迟的百分位数表现良好。同时,当值的范围并不清楚时,官方并不建议使用HDR Histogram,因为此时内存占用会很高。InfluxDB v2.0:InfluxDB同样提供了直方图的实现,与其它直方图略有不同。InfluxDB2.0可以设置直方图的桶的生成方式,linearBins()可以将数据按照线性分割,即桶宽相等,logarithmicBins()则可以将数据按照指数分割,即桶宽呈指数形式增长。GaussDB(for Influx):GaussDB(for Influx)支持两种直方图类型查询,一种确定桶数的等高直方图,另一种确定桶边界的定界直方图。等高直方图指每个桶的高度接近的直方图,而定界直方图指设定桶的上下边界值的直方图。定界直方图支持用户的自定义,更方便用户根据业务特点提取数据的关键分布特征。支持四种数据类型,包括整数、浮点数、字符串与布尔类型,可满足各行各业的数据分析需求。 3.   GaussDB(for Influx)直方图使用本章节通过实际的数据样例介绍GaussDB(for Influx)直方图的使用。3.1 数据样例示例采用的数据如下:mst是表名,包含4个field(每个field对应一种数据类型)与2个tag,元数据如下:> show field keys name: mst fieldKey fieldType -------- --------- address string age integer alive boolean height float > show tag keys name: mst tagKey ------ country name原始数据如下:> select * from mst name: mst time address age alive country height name ---- ------- --- ----- ------- ------ ---- 1629129600000000000 shenzhen 12 true china 70 azhu 1629129601000000000 shanghai 20 false american 80 alan 1629129602000000000 beijin 3 true germany 90 alang 1629129603000000000 guangzhou 30 false japan 121 ahui 1629129604000000000 chengdu 35 true ca** 138 aqiu 1629129605000000000 wuhan 48 china 149 agang 1629129606000000000 52 true american 153 agan 1629129607000000000 anhui 28 false germany alin 1629129608000000000 xian true japan 179 ali 1629129609000000000 hangzhou 60 false ca** 180 1629129610000000000 nanjin 102 true 191 ahuang 1629129611000000000 zhengzhou 123 false china 203 ayin3.2 等高直方图查询语法:SELECT HISTOGRAM( [ * | <field_key> | /<regular_expression>/ ] , <N> ) [WINTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] [LIMIT_clause] [OFFSET_clause] [SLIMIT_clause] [SOFFSET_clause]HISTOGRAM(field_key, N)计算指定指标field在各区间的统计值,其中N是要求的。HISTOGRAM(/regular_expression/, N)计算满足正则匹配的field在各区间的统计值。HISTOGRAM(*, N)计算整数与浮点数数据类型的field在各区间的统计值。查询示例1. 查询field_key为age且桶数为5的等高直方图。> select histogram(age, 5) from mst where time >= 1629129600000000000 and time <= 1629129611000000000 name: mst time histogram value ---- --------- ----- 0 20 3 0 30 2 0 48 2 0 60 2 0 9223372036854775807 22. 查询field_key满足正则匹配为/hei/(符合要求的只有height)且桶数为5的等高直方图。# 浮点数类型 > select histogram(/hei/, 5) from mst where time >= 1629129600000000000 and time <= 1629129611000000000 name: mst time histogram_height value ---- ---------------- ----- 0 90 3 0 138 2 0 153 2 0 180 2 0 1.7976931348623157e+308 23. 支持field为字符串类型的address与布尔类型的alive的等高直方图查询。> select histogram(address, 5) from mst where time >= 1629129600000000000 and time <= 1629129611000000000 name: mst time histogram value ---- --------- ----- 1629129600000000000 chengdu 3 1629129600000000000 hangzhou 2 1629129600000000000 shanghai 2 1629129600000000000 wuhan 2 1629129600000000000 zhengzhou 2 > select histogram(alive, 3) from mst where time >= 1629129600000000000 and time <= 1629129611000000000 name: mst time histogram value ---- --------- ----- 1629129600000000000 false 5 1629129600000000000 true 6下图分别表示上述查询的各等高直方图3.3 定界直方图查询语法:SELECT HISTOGRAM( [ * | <field_key> | /<regular_expression>/ ] , ‘specifyBins’, boundary1, boundary2,...,boundaryN) [WINTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] [LIMIT_clause] [OFFSET_clause] [SLIMIT_clause] [SOFFSET_clause]HISTOGRAM(field_key, ‘specifyBins’,  boundary1, boundary2,...,boundaryN)计算指定指标field在指定区间的统计值,specifyBins为定界直方图标志,boundaryN表示指定的各边界值,可以是整数、浮点数、字符串与布尔四种数据类型。HISTOGRAM(/regular_expression/, ‘specifyBins’,  boundary1, boundary2,...,boundaryN)计算满足正则匹配的field在指定区间的统计值。HISTOGRAM(*, ‘specifyBins’,  boundary1, boundary2,...,boundaryN)计算整数与浮点数数据类型的field指定区间的统计值。查询示例:1. 查询field_key为age且指定区间[0, 10), [10, 20), [20, 30), [30, 40), [40, 50)的定界直方图。# 整数类型 > select histogram(age, 'specifyBins', 10,20,30,40,50) from mst name: mst time histogram value ---- --------- ----- 0 10 1 0 20 2 0 30 2 0 40 1 0 50 12. 查询field_key满足正则匹配为/eight/(符合要求的只有height)且指定区间[0, 160), [160, 170), [170, 180), [180, 190), [190, 200)的定界直方图。# 浮点数类型 > select histogram(/eight/, 'specifyBins', 160.0, 170.0, 180.0, 190.0, 200.0) from mst name: mst time histogram value ---- --------- ----- 0 160 7 0 170 0 0 180 2 0 190 0 0 200 13. 支持field为字符串类型的address与布尔类型的alive的定界直方图查询。# 字符串类型 > select histogram(address, 'specifyBins', 'anhui', 'beijin', 'chengdu') from mst name: mst time histogram value ---- --------- ----- 0 anhui 1 0 beijin 1 0 chengdu 1 # 布尔类型 > select histogram(alive, 'specifyBins', false, true) from mst name: mst time histogram value ---- --------- ----- 0 false 5 0 true 6下图分别表示上述查询的各定界直方图。总结直方图作为一种经典的统计分析工具,由于其构建简单高效且能有效地描述数据分布特征,因此它的应用场景极其广泛,特别是在分析型数据库中。GaussDB(for Influx)中不仅支持了两种类型的直方图查询能力(等高与定界直方图),而且支持了四种数据类型(整数、浮点数、字符串与布尔型),能够帮助用户快速构建业务的数据分析能力,助力用户商业成功。另外,GaussDB(for Influx)还在集群化、冷热分级存储、查询、高可用方面也做了深度优化,能更好地满足时序应用的各种场景。结束本文作者:华为云数据库创新Lab & 华为云时空数据库团队 欢迎加入我们! 云数据库创新Lab(成都、北京)简历投递邮箱:xiangyu9@huawei.com 华为云时空数据库团队(西安、深圳)简历投递邮箱:yujiandong@huawei.com
  • [版主精选] 机不可失!教育部产学合作协同育人项目——华为云GaussDB项目申报等你来!
    为深化产教融合,推动校企合作,培养更多数据库人才,华为云GaussDB积极响应教育部号召,在2022年第一批“产学合作协同育人”项目的大框架下,继续设立“基于华为云GaussDB数据库的课程和实验体系”新工科建设项目,将华为多年潜心研发的GaussDB数据库引入高校课程体系,作为高校数据库课程的学习范本和实验平台,为高校提供免费的实验资源。该项目已于日前开始启动报名,时不我待,申报指南已备好,千万别错过!
  • [技术干货] 华为云GaussDB(for Influx)揭密第八期:GaussDB(for Influx)与开源企业版性能对比
    “你们的数据库性能怎么样?” “能不能满足我们的业务?” “和其他数据库对比性能有优势么?” ...... 客户在使用数据库时常有这样的担心和疑问。 本文从测试方案、测试工具、测试场景、测试结果等方面详细介绍了GaussDB(for Influx)和开源InfluxDB集群在X86架构下的性能测试情况。测试结果显示,GaussDB(for Influx)较企业版InfluxDB集群能提供更高的写入性能、更低的访问延迟以及更高的数据压缩率。 01 测试方案1.1 资源配置服务端配置产品名称规格存储架构GaussDB(for Influx)4U16G 2节点100G集群架构开源企业版InfluxDB4U16G 3节点100G集群架构1.2 测试工具测试工具为开源性能工具TS-benchMark。02 测试设计2.1  测试模型本次测试采用风力发电数据模型,每个风场50个设备,每个设备50个传感器,1个风场1个线程,通过load数据的线程数来控制时间线的大小,通过收集时间的长短来控制数据量。模型每条数据大小约为24字节,具体的类型如下:Timestamp | farm | device |sensor | value2.2  测试数据量测试数据分为两个场景,大数据量和小数据量,具体数据量如下:场景时间线数据量小数据量50004亿大数据量250万GaussDB(for Influx) 150亿 企业版InfluxDB 47亿注:企业版InfluxDB在插入到47亿数据时OOM,以下性能对比都基于此数据量。2.3  测试场景2.3.1  数据写入场景batch_size(每个批次写入的数据量) 固定为50,线程数分别从1、2、4、8、16、32、64、128、256、512 递增;线程数(客户端并发请求的连接数)固定为8, batch_size分别从50、100、150、200、250、300 递增。2.3.2  数据查询场景单线程进行不同语句的查询,并统计其时延信息。第一类查询:所有TAG查询select * from sensor where f='f1' and d='d2' and s='s1' and time>=1514768400000000000 and time<=1514772000000000000第二类查询:TAG+ VALUE查询select * from sensor where f='f1' and s='d2' and value>=3.0 and time>=1514768400000000000 and time<1514854800000000000第三类查询:聚合查询select mean(value) from sensor where f='f1' and s='s1' and time>=1514768400000000000 and time<=1514854800000000000 group by f,d,s,time(1h)第四类查询:或条件查询select * from sensor where f='f1' and (s='s1' or s='s2' or s='s3' or s='s4' or s='s5') and time>=1514768400000000000 and time<=1514769150000000000第五类查询:单个TAG查询select * from sensor where f='f1' and time>=1514768400000000000 and time<=151476915000000000003 测试结果分析3.1  写入吞性能比对在小数据量场景下,GaussDB(for Influx)的写入性能是企业版InfluxDB的13倍左右,在大数据量的场景下可以达到1.8倍左右。3.2 查询性能对比1) 第一类查询(所有TAG查询):无论是大数据量还是小数据量场景下,GaussDB(for Influx)的吞吐量是开源InfluxDB企业版的2倍左右。2) 第二类查询(TAG + VALUE查询):在小数据量场景下,开源InfluxDB企业版性能高于GaussDB(for Influx),GaussDB(for Influx)在大数据量和小数据量场景下性能基本持平。3)第三类查询(聚合查询):GaussDB(for Influx)查询性能明显优于开源InfluxDB企业版,在小数据量场景下是开源版本的14倍,大数据量下也是开源版本的8倍左右。4)第四类查询(或条件查询):GaussDB(for Influx)查询性能在两种场景下比较稳定,开源企业版InfluxDB在两种场景下差异较大;GaussDB(for Influx)在小数据量场景下表现优于开源版,在大数据量场景下低于开源版。5)第五类查询(单个TAG查询):GaussDB(for Influx)查询性能在两种场景下比较稳定,在大数据量场景下低于开源版。3.3  数据压缩率对比在250万时间线场景下,GaussDB(for Influx)导入了151亿条数据,导入前数据大小为337.5G,导入后为49.8G,压缩率为6.8;开源企业版导入了47亿条数据,导入前105G,导入后21.3G,压缩率为4.9。GaussDB(for Influx)压缩率是开源企业版的1.4倍左右。Influx引擎采用LSM tree架构,随着后台compaction的进行,压缩率会进一步提升,当前数据对比是数据刚导入时的结果。04 总结在GaussDB(for Influx)2节点对比开源版3节点场景下,GaussDB(for Influx)给客户带来了更高的写入能力、更稳定的查询能力、更高的压缩率。GaussDB(for Influx)写入能力在小数据量场景下是开源企业版的13倍,在大数据量场景下是开源企业版的1.8倍;查询能力在两种场景下表现稳定,在大部分查询场景下优于开源企业版;在压缩率方面,同样数据模型下,高出开源版本40%。除了以上优势外,GaussDB(for Influx)还在集群化、冷热分级存储、高可用方面也做了深度优化,能更好地满足时序应用的各种场景。05 结束本文作者:华为云数据库创新Lab & 华为云时空数据库团队欢迎加入我们!云数据库创新Lab(成都、北京)简历投递邮箱:xiangyu9@huawei.com华为云时空数据库团队(西安、深圳)简历投递邮箱:yujiandong@huawei.com
  • [经验分享] 使用MindStudio进行MindSpore训练脚本开发
    配套视频链接:https://b23.tv/BV1jT4y167th1、 MindSpore环境搭建和配置介绍1、 MindSpore简介MindSpore是一个全场景深度学习框架,旨在实现易开发、高效执行、全场景覆盖三大目标,其中易开发表现为API友好、调试难度低,高效执行包括计算效率、数据预处理效率和分布式训练效率,全场景则指框架同时支持云、边缘以及端侧场景。MindSpore总体架构如下图所示,其中:ModelZoo(网络样例):ModelZoo提供可用的深度学习算法网络,也欢迎更多开发者贡献新的网络。MindSpore Extend(扩展层):MindSpore的扩展包,支持拓展新领域场景,如GNN/深度概率编程/强化学习等,期待更多开发者来一起贡献和构建。MindScience(科学计算):MindScience是基于MindSpore融合架构打造的科学计算行业套件,包含了业界领先的数据集、基础模型、预置高精度模型和前后处理工具,加速了科学行业应用开发。MindExpression(表达层):基于Python的前端表达与编程接口。同时未来计划陆续提供C/C++、华为自研编程语言前端-仓颉(目前还处于预研阶段)等第三方前端的对接工作,引入更多的第三方生态。MindData(数据处理层):提供高效的数据处理、常用数据集加载等功能和编程接口,支持用户灵活的定义处理注册和pipeline并行优化。MindCompiler(编译优化层):图层的核心编译器,主要基于端云统一的MindIR实现三大功能,包括硬件无关的优化(类型推导、自动微分、表达式化简等)、硬件相关优化(自动并行、内存优化、图算融合、流水线执行等)、部署推理相关的优化(量化、剪枝等)。MindRT(全场景运行时):MindSpore的运行时系统,包含云侧主机侧运行时系统、端侧以及更小IoT的轻量化运行时系统。MindInsight(可视化调试调优工具):提供MindSpore的可视化调试调优等工具,支持用户对训练网络的调试调优。MindArmour(安全增强包):面向企业级运用时,安全与隐私保护相关增强功能,如对抗鲁棒性、模型安全测试、差分隐私训练、隐私泄露风险评估、数据漂移检测等技术。MindSpore源于全产业的最佳实践,向数据科学家和算法工程师提供了统一的模型训练、推理和导出等接口,支持端、边、云等不同场景下的灵活部署,推动深度学习和科学计算等领域繁荣发展。MindSpore提供了Python编程范式,用户使用Python原生控制逻辑即可构建复杂的神经网络模型,AI编程变得简单。目前主流的深度学习框架的执行模式有两种,分别为静态图模式和动态图模式。静态图模式拥有较高的训练性能,但难以调试。动态图模式相较于静态图模式虽然易于调试,但难以高效执行。MindSpore提供了动态图和静态图统一的编码方式,大大增加了静态图和动态图的可兼容性,用户无需开发多套代码,仅变更一行代码便可切换动态图/静态图模式,例如设置context.set_context(mode=context.PYNATIVE_MODE)切换成动态图模式,设置context.set_context(mode=context.GRAPH_MODE)即可切换成静态图模式,用户可拥有更轻松的开发调试及性能体验。神经网络模型通常基于梯度下降算法进行训练,但手动求导过程复杂,结果容易出错。MindSpore的基于源码转换(Source Code Transformation,SCT)的自动微分(Automatic Differentiation)机制采用函数式可微分编程架构,在接口层提供Python编程接口,包括控制流的表达。用户可聚焦于模型算法的数学原生表达,无需手动进行求导。随着神经网络模型和数据集的规模不断增加,分布式并行训练成为了神经网络训练的常见做法,但分布式并行训练的策略选择和编写十分复杂,这严重制约着深度学习模型的训练效率,阻碍深度学习的发展。MindSpore统一了单机和分布式训练的编码方式,开发者无需编写复杂的分布式策略,在单机代码中添加少量代码即可实现分布式训练,例如设置context.set_auto_parallel_context(parallel_mode=ParallelMode.AUTO_PARALLEL)便可自动建立代价模型,为用户选择一种较优的并行模式,提高神经网络训练效率,大大降低了AI开发门槛,使用户能够快速实现模型思路。2、 MindSpore环境安装配置选择适合自己的环境条件后,获取命令并按照指南进行安装,或使用云平台创建和部署模型安装细节参见链接:https://www.mindspore.cn/install 验证是否成功安装python -c "import mindspore;mindspore.run_check()"如果输出:MindSpore version: 版本号The result of multiplication calculation is correct, MindSpore has been installed successfully!说明MindSpore安装成功了。二、MindStudio简介与安装1、MindStudio简介Mind Studio是一套基于华为昇腾AI处理器开发的AI全栈开发平台,包括基于芯片的算子开发、以及自定义算子开发,同时还包括网络层的网络移植、优化和分析,另外在业务引擎层提供了一套可视化的AI引擎拖拽式编程服务,极大的降低了AI引擎的开发门槛,全平台通过Web的方式向开发者提供以下4项服务功能。针对安装与部署,MindStudio提供多种部署方式,支持多种主流操作系统,为开发者提供最大便利。针对算子开发,MindStudio提供包含UT测试、ST测试、TIK算子调试等的全套算子开发流程。支持TensorFlow、PyTorch、MindSpore等多种主流框架的TBE和AI CPU自定义算子开发。针对网络模型的开发,MindStudio支持TensorFlow、Pytorch、MindSpore框架的模型训练,支持多种主流框架的模型转换。集成了训练可视化、脚本转换、模型转换、精度比对等工具,提升了网络模型移植、分析和优化的效率。针对应用开发,MindStudio集成了Profiling性能调优、编译器、MindX SDK的应用开发、可视化pipeline业务流编排等工具,为开发者提供了图形化的集成开发环境,通过MindStudio能够进行工程管理、编译、调试、性能分析等全流程开发,能够很大程度提高开发效率。MindStudio功能框架如图1所示,目前含有的工具链包括:模型转换工具、模型训练工具、自定义算子开发工具、应用开发工具、工程管理工具、编译工具、流程编排工具、精度比对工具、日志管理工具、性能分析工具、设备管理工具等多种工具。MindStudio工具中的主要几个功能特性如下:工程管理:为开发人员提供创建工程、打开工程、关闭工程、删除工程、新增工程文件目录和属性设置等功能。SSH管理:为开发人员提供新增SSH连接、删除SSH连接、修改SSH连接、加密SSH密码和修改SSH密码保存方式等功能。应用开发:针对业务流程开发人员,MindStudio工具提供基于AscendCL(Ascend Computing Language)和集成MindX SDK的应用开发编程方式,编程后的编译、运行、结果显示等一站式服务让流程开发更加智能化,可以让开发者快速上手。自定义算子开发:提供了基于TBE和AI CPU的算子编程开发的集成开发环境,让不同平台下的算子移植更加便捷,适配昇腾AI处理器的速度更快。离线模型转换:训练好的第三方网络模型可以直接通过离线模型工具导入并转换成离线模型,并可一键式自动生成模型接口,方便开发者基于模型接口进行编程,同时也提供了离线模型的可视化功能。日志管理:MindStudio为昇腾AI处理器提供了覆盖全系统的日志收集与日志分析解决方案,提升运行时算法问题的定位效率。提供了统一形式的跨平台日志可视化分析能力及运行时诊断能力,提升日志分析系统的易用性。性能分析:MindStudio以图形界面呈现方式,实现针对主机和设备上多节点、多模块异构体系的高效、易用、可灵活扩展的系统化性能分析,以及针对昇腾AI处理器的性能和功耗的同步分析,满足算法优化对系统性能分析的需求。设备管理:MindStudio提供设备管理工具,实现对连接到主机上的设备的管理功能。精度比对:可以用来比对自有模型算子的运算结果与Caffe、TensorFlow、ONNX标准算子的运算结果,以便用来确认神经网络运算误差发生的原因。开发工具包的安装与管理:为开发者提供基于昇腾AI处理器的相关算法开发套件包Ascend-cann-toolkit,旨在帮助开发者进行快速、高效的人工智能算法开发。开发者可以将开发套件包安装到MindStudio上,使用MindStudio进行快速开发。Ascend-cann-toolkit包含了基于昇腾AI处理器开发依赖的头文件和库文件、编译工具链、调优工具等下表表1为MindStudio版本配套关系将MindStudio安装在Windows服务器上时,Windows服务器为本地环境,Linux服务器为远端环境。本地环境要求:Windows 10 x86_64操作系统。2、MindStudio安装安装python1、MindStudio目前支持Python版本为3.7.0 ~3.9.7,下面以安装Python3.7.5依赖包为例。选择Windows x86-64 executable installer。其他安装细节请参考链接:https://www.hiascend.com/document/detail/zh/mindstudio/304/instg/atlasms_02_0022.html 2、打开系统命令行,输入python -V命令确认python版本是否为3.7.5。安装Python3相关依赖。pip install xlrd==1.2.0 pip install absl-pypip install numpy如若返回如下信息,则表示安装成功。Successfully installed xlrd-1.2.0Successfully installed absl-py-0.12.0 six-1.15.0Successfully installed numpy-1.20.1安装MinGW1、请用户到下载最新的MinGW安装包,根据系统选择对应版本,例如windows64位选择x86_64-posix-seh。安装细节参见链接:https://www.hiascend.com/document/detail/zh/mindstudio/304/instg/atlasms_02_0022.html 3、打开系统命令行,输入gcc -v命令。当界面提示“gcc version x.x.x (x86_64-posix-sjlj-rev0, Built by MinGW-W64 project)”信息时,表示安装成功。若未提示该信息,请尝试重启计算机。安装cMakeCMake是个一个开源的跨平台自动化建构系统,用来管理软件建置的程序,并不依赖于某特定编译器,并可支持多层目录、多个应用程序与多个库。1、获取CMake,推荐安装的版本为3.16.5-win64-x64。安装细节请参考链接:https://www.hiascend.com/document/detail/zh/mindstudio/304/instg/atlasms_02_0022.html 安装jdk111、请注意mindstudio不支持jdk8,请安装jdk11安装细节参考链接:https://gitee.com/ascend/docs-openmind/blob/master/guide/mindstudio/cases/tutorials/Windows安装MindStudio.md#安装java依赖 2、在cmd中输入javac –-version和java –version,得到如下输出,代表安装完成安装mindstudio1、软件安装前,请获取所需软件包和对应的数字签名文件。(1) MindStudio_{version}_win.zip,MindStudio免安装压缩包,含有GUI的集成开发环境。获取链接:https://www.hiascend.com/software/mindstudio/download (2)MindStudio_{version}_win.exe,MindStudio安装包,含有GUI的集成开发环境。获取链接:https://www.hiascend.com/software/mindstudio/download 2、为了防止软件包在传递过程或存储期间被恶意篡改,下载软件包时需下载对应的数字签名文件用于完整性验证。3、安装MindStudio--两种方式(1)以免安装压缩包形式,直接解压到相应文件目录即可(2)下载exe文件以及对应的数字签名文件安装参考链接:https://www.hiascend.com/document/detail/zh/mindstudio/304/instg/atlasms_02_0023.html 启动MindStudio,如图即为启动成功三、训练工程创建,工程功能以及相关菜单介绍1、启动MindStudio2、本文以hypertext模型为例,介绍使用MindStudio进行MindSpore训练脚本开发流程下载hypertext项目代码,项目地址https://gitee.com/mindspore/models/tree/master/research/nlp/hypertext3、点击Open按钮4、选择项目所在位置,添加hypertext项目,点击OK5、项目结构如图所示6、代码目录结构如图所示点击File->Projects Structure点击Add Python SDK选择SSH Interpreter,点击Deploy后的按钮点击左上角+号,输入服务器IP地址,点击OK点击File->settings->tools->deployment,配置映射。点击左上角加号,输入连接名称。connection选项是基本的连接配置,类型一般选用SFTP,点击右侧按钮,输入服务器ip地址和端口号,然后可以点击Test SFTP connection按钮测试连接是否通畅。下拉选择刚才配置好的ssh连接接下来点击mapping配置映射关系,依次点击1,2选择。local path要求的是填入本地的项目名称路径,接下来的是部署到服务器上的项目名称,这两个可以保持一致,也可以不保持一致。excluded paths(非必需)为配置忽略路径,表示忽略的项目文件不会上传到远程服务器。配置完成后,选中项目文件夹,然后按以下步骤将代码同步至服务器点击OK,点击右侧按钮选择所需要的python解释器。Name的值可以随意取。点击两次OK,完成配置。等待进度条结束,将会自动上传项目到远程服务器。当本地文件进行修改需要上传到服务器时,点击项目名称hypertext,再选择Tools->Deployment->Upload to上传项目。同理,Download项目可以下载服务器文件到本地。勾选Automatic Upload,可以在每次本地文件保存后,自动同步项目到服务器。至此,本地项目连接到远程服务器的步骤完成。点击工具栏Ascend,将项目转化为昇腾项目,如图所示:然后按照如下进行配置:转换完成的界面如图所示:若提示没有CANN,在File->Setting下搜索CANN,点击Install配置等待同步完成相关菜单介绍:菜单区菜单图标功能说明新建项目,文件等相关操作重构项目及相关操作构建项目及相关操作运行目标文件及相关操作昇腾项目相关操作保存文件或项目模板、项目上传下载等相关操作按键区菜单图标功能说明打开文件夹或项目保存当前文件及配置重新从磁盘加载所有文件文件的前进/后退操作当前选择的运行配置运行当前运行配置调试当前运行配置停止当前程序的运行工具区菜单图标功能说明当前程序的输出日志记录文件待办:特殊注释,待实现的功能注释运行期间出现的报错及警告等信息当前python解释器所安装的包等本地终端远程终端文件上传和下载的记录四、模型迁移本部分简要介绍mindspore模型开发的要点,详细开发教程与API可参考mindspore官网:https://www.mindspore.cn/ ,也可以在昇腾论坛进行讨论和交流:https://bbs.huaweicloud.com/forum/forum-726-1.html 1、计算图构建model:计算图需要继承mindspore.nn.Cell类,在__init__函数中完成初始化,并在construct函数中编写前向传播代码(反向传播代码由mindspore框架自动完成)。本案例的计算图在src/hypertext.py中,如图所示,拼接词嵌入Ngram,并通过einstein_midpoint(爱因斯坦中点计算)和hyperLinear(莫比乌斯变换),最后通过logmap0返回分类结果。einstein_midpoint和hyperLinear的实现在src/poincare.py中,poincare中主要实现了庞加莱球的各类运算,其中的类继承了mindspore.nn.Cell类,仍属于计算图的一部分。2、自定义优化器optimizer:在mindspore中已经实现了大量的优化器,一般情况下可以直接调用,不需要自定义优化器。由于本案例的计算图基于双曲空间实现,使用欧氏空间的优化器效果很差,因此需要自行实现。自定义的优化器,实现在src/radam_optimizer.py中,如图所示。自定义优化器需要继承Optimizer类,Optimizer类继承于mindspore.nn.Cell类,Optimizer类是优化器的基类。因此我们自定义的优化器依旧需要向计算图一样,在construct中完成前向传播代码的编写。3、 定义损失函数loss:在src/hypertext_train.py中自定义损失函数,继承nn.Cell类4、 定义数据集dataset:在src/dataset.py中,我们需要实现__getitem__(self,item)与__len__(self)函数,前者实现依据item下标随机取得数据集中元素的功能,__len__(self)返回数据集的总长度5、 训练我们通过实例化loss,optimizer,model,dataset,并通过callbacks回调接口取得相关训练信息用于输出6、 分布式训练train_single函数实现了单卡训练,train_paralle实现了多卡训练。train_paralle与train_single的区别主要在于分布式训练额外设置了一些与分布式训练的参数和环境,并不复杂,区别并不大。五、使用MindStudio运行hypertext模型演示1.介绍模型及数据集1、论文名称:HyperText: Endowing FastText with Hyperbolic Geometry项目地址为https://gitee.com/mindspore/models/tree/master/research/nlp/hypertext2、自然语言数据呈现出树状的层次结构,如WordNet中的hypernymhyponym关系。考虑到双曲空间自然适合于树状分层数据的建模,原作者提出了一个名为HyperText的新模型,通过赋予FastText以双曲几何形状来实现高效的文本分类。经验表明,HyperText在一系列文本分类任务中的表现优于FastText,而且参数大大减少。3、模型架构:HyperText 基于双曲空间的庞加莱球模型。首先利用单词或 ngram 的庞加莱球嵌入捕捉自然语言句子中的潜在层次结构,然后使用Einstein中点作为池化方法来强调语义特定词(包含更多信息出现频率低于一般词),最后使用Mobius线性变换作为双曲线分类器。4、数据集:tnews数据集是今日头条新闻标题,用于短文本分类,包括2018年5月之前今日头条发布的中文新闻,共计73,360条标题。每个标题都标有 15 个新闻类别(金融、技术、体育等)之一。iflytek数据集是科大讯飞数据集,用于长文本分类包含 17,332 个应用程序描述,包含和日常生活相关的各类应用主题,共119个类别,例如食品、汽车租赁、教育等。2.执行数据预处理1、在服务器上安装第三方库pkuseg、tqdm:命令:pip install pkuseg -i https://pypi.tuna.tsinghua.edu.cn/simplepip install tqdm -i https://pypi.tuna.tsinghua.edu.cn/simple2、下载数据集:下载[TNEWS]数据集:(https://bj.bcebos.com/paddlehub-dataset/tnews.tar.gz)下载[IFLYTEK]数据集:(https://bj.bcebos.com/paddlehub-dataset/iflytek.tar.gz)并解压至./hypertext/data/tnews,./hypertext/data/iflytek目录下,并创建./hypertext/data/tnews_public与./hypertext/data/iflytek_public空目录,如图所示。之后右键点击data->Deployment->uploadto,将data目录上传至服务器。3、执行数据预处理。点击Run->Edit Configurations,在弹出的配置页面中,点击左上角“+”按钮,选择Python。Name为该运行配置名称,不能重复。Script path填入本地被执行python文件位置,选择create_dataset.py,parameters为运行所需的参数,Working direcroty为当前项目根目录。点击绿色三角运行。参数配置说明如下:参数说明Script path需要执行的脚本文件路径Parameters脚本执行所需的参数Environment Variables配置环境变量,直接采用默认的即可Python interpreter指定python解释器Working directory脚本所在的项目目录(1)处理iflytek数据集,parameters中填入的参数为:--data_dir /hypertext/data/iflytek --out_data_dir /hypertext/data/iflytek_public --datasetType iflytek 运行结束后,右键点击data-> Deployment->downloadto,将iflytek_public目录中的文件下载至本地。(2)处理并下载tnews数据集,parameters中填入的参数为--data_dir /hypertext/data/tnews --out_data_dir /hypertext/data/tnews_public --datasetType tnews。注意:在每次预处理完成后,请将服务器中data目录下的文件同步到本地,否则再次运行时这些文件将会被删除,导致训练失败。3.执行训练/评估1、在每次训练完成后,请将服务器中output目录下的文件同步到本地,否则再次运行时这些文件将会被删除,导致不能评估2、执行训练,点击Run->Edit Configurations,在弹出的配置页面中,点击左上角“+”按钮,选择Ascend Trainingg,如下图。Name为该运行配置名称,不能重复。Executable填入本地被执行python文件位置,选择train.py。Command Aarguments为运行所需的参数。点击绿色三角运行。参数配置说明如下:参数说明Run Mode本地或者远程运行Deployment需要使用的远程服务环境Executable需要执行的脚本文件路径Command Arguments脚本执行所需的参数Environment Variables配置环境变量,这里不需要配置(1)训练tnews数据集,Command Aarguments中填入--datasetdir ./data/tnews_public --datasetType tnews --device Ascend运行结果(部分),如图所示:(2)训练iflytek数据集,Command Aarguments中填入--datasetdir ./data/iflytek_public --datasetType iflytek --device Ascend运行结果(部分),如图所示:3、执行评估:点击Run->Edit Configurations,在弹出的配置页面中,点击左上角“+”按钮,选择Python。Name为该运行配置名称,不能重复。Script path填入本地被执行python文件位置,选择eval.py,parameters为运行所需的参数,Working direcroty为当前项目根目录。点击绿色三角运行。(1)评估tnew数据集,parameters中填入的参数为--datasetdir ./data/tnews_public --modelPath ./output/hypertext_tnews.ckpt --datasetType tnews --device Ascend。运行结果(部分),如图所示:(2)评估iflytek数据集,parameters中填入的参数为--datasetdir ./data/tnews_public --modelPath ./output/hypertext_tnews.ckpt --datasetType tnews --device Ascend运行结果(部分),如图所示:4.导出mindir模型1、导出模型,点击Run->Edit Configurations,在弹出的配置页面中,点击左上角“+”按钮,选择Ascend Trainingg,如下图。Name为该运行配置名称,不能重复。Executable填入本地被执行python文件位置,选择export.py。Command Aarguments为运行所需的参数,点击绿色三角运行。(1)导出tnews数据集的训练模型:parameters中填入的参数为--modelPath ./output/hypertext_tnews.ckpt --datasetType tnews --device Ascend --batch_size 1文件生成在./hypertext/hypertext_tnews.mindir,如图所示:(2)导出iflytek数据集的训练模型:parameters中填入的参数为--modelPath ./output/hypertext_iflytek.ckpt --datasetType iflytek --device Ascend --batch_size 1文件生成在./hypertext/hypertext_iflytek.mindir,如图所示:六、MindInsight训练可视化1.安装MindInsight安装mindinsight,pip方式安装:安装PyPI上的版本:pip install mindinsight安装自定义版本:Pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/{version}/MindInsight/any/mindinsight-{version}-py3-none-any.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple配置环境变量:1.执行如下命令打开文件系统中的~/.bashrc文件:vi ~/.bashrc在文件最后添加如下环境变量:export PATH=/usr/local/python3/bin:$PATH“/usr/local/python3/bin”为示例安装路径,请根据实际情况配置。:wq!保存退出。2.执行命令使环境变量生效。source ~/.bashrc3.验证是否成功安装。执行如下命令:mindinsight --version如果出现下列提示,说明安装成功。4.重启MindStudio以启用MindInsight组件。2.使用MindInsight组件收集summary数据,实现训练可视化:通过SummaryCollector自动收集:第一步:在train.py中导入SummaryCollectorfrom mindspore.train.callback import SummaryCollector第二步:在train.py代码中实例化 SummaryCollectorSummaryCollector并添加到callbacks中,其中collect_freq为收集频率,设置的值太小时容易造成mindinsight看板卡顿:summary_collector = SummaryCollector(summary_dir='./summary_dir',collect_freq=32)callbacks = [LossMonitor(10), eval_cb, TimeMonitor(50), summary_collector]第三步:需要注意的是,如果想非localhost访问UI,需要进行如下操作:1.找到mindinsight包的位置pip show mindinsight2.cd到Location下的mindinsight目录,如:/usr/local/python3.7.5/lib/python3.7/site-packages/mindinsight3.打开conf目录下的contants.py文件,按照下图,修改HOST、ENABLE_CORS和SUPPORT_REQUEST_METHODS:第四步:进入MindInsight管理界面在工具栏选择“Ascend >MindInsight”打开MindInsight管理界面。MindInsight管理界面可显示并管理多个MindInsight训练可视化工程。MindInsight管理界面相关属性说明如下图所示。点击Enable按钮,配置MindInsight组件相关参数。参数配置说明如下:参数说明Summary Base Dir指定summary数据存放的根目录,注意是在当前项目所在目录基础之上的workspace指定workspace目录,目前主要用于存放MindInsight日志,默认路径:[HOME]/mindinsightport指定端口号,默认8080,但8080容易和其他服务的端口冲突,建议设置自己的端口号单击“OK”完成MindInsight组件相关参数配置,出现如图所示界面,说明配置成功(注意,Run Config的名称是执行训练/评估步骤中Ascend Training中的配置的名称,可能有所变化)第五步:点击view按钮即可跳转进入浏览器,即可进入到UI面板界面第六步:分别在两个数据集上运行训练,即可得到各自的训练可视化情况。若想停止监控,单击“Disable”停止MindInsight可视化进程。训练样板如下所示:点击Traing Dashboard,可以看见训练看板中的各类数据,右上角可以选择开启/关闭自动刷新看板信息和刷新频率。点击Training Scalar Information,可以查看详细的loss信息,并且有开启/关闭Loss曲线全屏等功能。点击Parameter Distribution,可以查看参数分布情况点击Tensor可以查看张量具体信息,这里未收集所以不能查看点击Computational Graph,可以查看计算图点击Data Graph可以查看Data Graph点击Data Sampling可对样本图片进行取样查看,但是由于本案例是文本分类,不涉及图片,因此无法查看。七、FAQ1、 启动MindStudio时报错,提示如下错误。解决方法:这是由于配置的jdk版本有误导致启动失败,MindStudio支持的版本为jdk11,正确安装和配置jdk11后即可启动成功二、执行预处理后,再执行训练时,File Transfer中显示将预处理后的数据集删除。或者是其他File Transfer中显示为了同步而将文件删除的情况解决方法:请尝试以下两种解决方法(1)Mindstudio在会保证本地项目文件与服务器项目文件完全一致,在每次上传本地文件夹到服务器或运行代码时,将会删除服务器上存在但本地不存在的文件。因此,当执行的代码需要用到服务器中文件,却没有同步到本地时,请先同步到本地。(2)请将项目转换为Ascend项目,此时同步策略将转为增量上传/下载,不会删除那些本地和服务器上不一致的文件三、配置完远程python解释器后,本地代码提示导入包报错解决方法:根据出错情况,请尝试以下几种解决方案(1)服务器上未安装对应包,或者是python解释器选择错误,请安装对应包,或者是重新选择解释器。(2)若确认包和解释器无误,选择File->lnvalidate Caches...,重启Mindstudio并刷新缓存。(3)若刷新缓存后,依旧存在某些包未下载到本地的情况,请删除C:\Users\用户名\AppData\Local\Huawei\MindStudioMS-3.0\remote_sources\目录下的所有文件,并重启MindStudio,等待包下载到本地完成即可。其中该目录依据安装情况可能有所出入,如果未找到该目录,在本地项目中选择一个导入成功的包,按Ctrl+B跳转,可以查看目录。如图所示。四、使用MindInsight可视化,单击“View”查看训练工程日志信息。打开Web UI,可视化查看实时训练信息,显示浏览器无法连接,如图所示。解决方法1. 进入MindStudio后台,编辑sshd_config配置文件vi /etc/ssh/sshd_config2. 将AllowAgentForwarding由no改成yes后保存退出。3. 重启sshd服务使修改生效systemctl restart sshd.service4. 再次开启MindInsight可视化,单击“View”查看训练工程日志信息。五、启动mindinsight,再启动训练之后,mindinsight进程被杀并提示如下错误。这种情况是因为进程冲突导致报错,请在启动训练之前添加if __name__=='__main__':,例如启动训练代码为:run_train(train_dataset, dev_dataset, config.learning_rate, args.run_distribute)修改为:if __name__=='__main__':run_train(train_dataset,dev_dataset,config.learning_rate,args.run_distribute)8、 从昇腾官方中体验更多内容mindspore模型开发教程与API可参考mindspore官网:https://www.mindspore.cn/ ,也可以在昇腾论坛进行讨论和交流:https://bbs.huaweicloud.com/forum/forum-726-1.html
  • 【持续更新】GaussDB数据库学院干货汇总
    类别 产品 名称在线课程GaussDB GaussDB实战训练营 华为云数据库GaussDB GaussDB关键技术特性入门 华为云数据库GaussDB介绍 GaussDB新一代关系型数据库技术揭秘 GaussDB 数据存储与访问 GaussDB(for MySQL) 【系列课程】华为GaussDB OLTP数据库高级工程师学习 【系列课程】数据库原理及应用学习 【系列课程】数据库工程师学习路径 RDS for MySQL 7天玩转MySQL基础实战营 RDS for PostgresSQL 7天玩转PostgreSQL基础训练营 GaussDB(for Mongo) MongoDB分布式事务内核源码简介 秒级水平拓展的-GaussDB(for Mongo)架构剖析 GaussDB(for Redis) 当Redis遇见计算存储分离 GaussDB(for Influx) 云原生时代下的时序数据库GaussDB(for Influx) DDS 华为云数据库DDS产品深度赋能 玩转MongoDB从入门到实战 公共 云享读书会《SQL优化核心思想》 端到端安全可信,华为云数据库解决方案最佳实践 华为云数据库架构设计 HCSD实训营数据库技能测评(活动课程) HCSD实训营在线实践(活动课程)CodeLab GaussDB SQL调优之改写SQL消除子查询 SQL调优之建立合适的索引 SQL调优之选择合适的分布列 GaussDB(for MySQL) GaussDB(for MySQL)如何快速创建索引 GaussDB(for MySQL) HTAP只读分析特性详解 RDS for MySQL 通过接口调用方式创建RDS 基于Python搭建云数据库应用 GaussDB(for Redis) 华为云GaussDB(for Redis)与开源Redis集群性能对比 GaussDB(for Influx) GaussDB(for Influx)时序分析平台使用指南 GaussDB(for Cassandra) 华为云GaussDB(for Cassandra)与自建开源Cassandra性能对比 DAS 如何通过SQL模板检查并进行表优化 基于DAS服务的数据**与回滚场景实践 DDS DDS通过SQL优化来提升DDS性能 DDS如何规避mongos路由缓存缺陷 DDS如何通过设置数据分片来提升性能 DDS CPU使用率高的问题排查方法 DRS 实时同步数据加工 PostgreSQL数据库同步 基于DRS服务的MySQL数据库云上迁移实践 公共 【特性指南】分区表查询增强特性用户指南 DDM分库分表实践 - 解决单机数据库困境 DDM查询执行计划介绍 DDM+MySQL扩展来破除业务性能瓶颈沙箱实验 RDS for MySQL 10分钟快速入门RDS 数据库服务实践 DRS 使用DRS实现数据实时同步 MySQL本地数据库迁移 公共 使用CDM将CSV文件迁移至RDS 通过CDM同步数据到MRS Hive 使用Python爬虫抓取图片和文字实验微认证 RDS for MySQL 华为云数据库服务实践 GaussDB(for Mongo) 基于MongoDB使用Java实现图书管理系统 DRS MySQL数据库迁移上云 公共 云数据库性能对比测试 使用Python爬虫抓取图片 openGauss数据库在金融领域的使用实践 基于华为云DevCloud的托马斯商城