本文由云+社区发表做者:董超javascript
导语:如今人工智能是个大热点,而人工智能离不开机器学习,机器学习中深度学习又是比较热门的方向,本系列文章就从实战出发,介绍下如何使用MXnet进行深度学习~ 既然是实战并且本文是入门级别的咱们就不讲那么多你们都听不懂的数学公式啦~html
虽然吧,咱们不讲哪些深奥的数学原理,可是基本的原理仍是要掌握下的~java
在介绍深度学习以前咱们要先了解两个概念,机器学习和神经网络。python
在介绍深度学习以前,咱们先简单介绍下机器学习,咱们引用下维基百科上机器学习的定义:git
机器学习是人工智能的一个分支。人工智能的研究是从以“推理”为重点到以“知识”为重点,再到以“学习”为重点,一条天然、清晰的脉络。显然,机器学习是实现人工智能的一个途径,即以机器学习为手段解决人工智能中的问题。机器学习在近30多年已发展为一门多领域交叉学科,涉及几率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。github
机器学习理论主要是设计和分析一些让计算机能够自动“学习”的算法。机器学习算法是一类从数据中自动分析得到规律,并利用规律对未知数据进行预测的算法。由于学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤其密切,也被称为统计学习理论。算法设计方面,机器学习理论关注能够实现的,行之有效的学习算法。不少推论问题属于无程序可循难度,因此部分的机器学习研究是开发容易处理的近似算法。算法
简单的说机器学习就是让机器去分析数据找规律,并经过找到的规律对新的数据进行处理。网络
以图像为例子,每一个数据或者输入就是一张图片,而里面的每一个x能够是图片中的每一个像素。对于每一个像素咱们都赋予一个权重,而后通过转换函数(Transfer Function, 这里是线性叠加)获得一个数值。简单来讲,咱们对全部像素作个线性加权叠加。获得的数值会通过激活函数获得新的数值。这个激活函数(Activation Function)每每是那几个符合某些特性的非线性函数。为何须要非线性的转换呢?举个简单的例子,在同一个平面你和你的影子是重叠是分不开的,在立体的空间大家却能分开了。非线性的转换有相似的做用。经常使用的激活函数有relu, softmax, tanh。框架
简单的说一个神经元是一个简单的分类器,你输入一个iphone
好比咱们有一大堆猫、狗照片,把每一张照片送进一个机器里,机器须要判断这幅照片里的东西是猫仍是狗。咱们把猫狗图片处理一下,左边是狗的特征向量,右边是猫的
你们想一想,最简单地把这两组特征向量分开的方法是啥?固然是在两组数据中间画一条竖直线,直线左边是狗,右边是猫,分类器就完成了。之后来了新的向量,凡是落在直线左边的都是狗,落在右边的都是猫。
一条直线把平面一分为二,一个平面把三维空间一分为二,一个n-1维超平面把n维空间一分为二,两边分属不一样的两类,这种分类器就叫作神经元。
固然,上面那幅图咱们是开了上帝视角才知道“一条竖直线能分开两类”,在实际训练神经元时,咱们并不知道特征是怎么抱团的。神经元模型的一种学习方法称为Hebb算法:
先随机选一条直线/平面/超平面,而后把样本一个个拿过来,若是这条直线分错了,说明这个点分错边了,就稍微把直线移动一点,让它靠近这个样本,争取跨过这个样本,让它跑到直线正确的一侧;若是直线分对了,它就暂时停下不动。所以训练神经元的过程就是这条直线不断在跳舞,最终跳到两个类之间的竖直线位置。
神经网络简单点将就是由好多个神经元组成的系统。
神经元一个缺点是:它只能切一刀!你给我说说一刀怎么能把下面这两类分开吧。
解决办法是多层神经网络,底层神经元的输出是高层神经元的输入。咱们能够在中间横着砍一刀,竖着砍一刀,而后把左上和右下的部分合在一块儿,与右上的左下部分分开;也能够围着左上角的边沿砍10刀把这一部分先挖出来,而后和右下角合并。
每砍一刀,其实就是使用了一个神经元,把不一样砍下的半平面作交、并等运算,就是把这些神经元的输出看成输入,后面再链接一个神经元。这个例子中特征的形状称为异或,这种状况一个神经元搞不定,可是两层神经元就能正确对其进行分类。
只要你能砍足够多刀,把结果拼在一块儿,什么奇怪形状的边界神经网络都可以表示,因此说神经网络在理论上能够表示很复杂的函数/空间分布。可是真实的神经网络是否能摆动到正确的位置还要看网络初始值设置、样本容量和分布。
那什么是深度学习呢?深度学习简单点说就是一种为了让层数较多的多层神经网络能够训练,可以运行起来而演化出来的一系列的新的结构和新的方法。
就像下图
普通的神经网络可能只有几层,深度学习能够达到十几层。深度学习中的深度二字也表明了神经网络的层数。如今流行的深度学习网络结构有"CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的等。
固然咱们是以实战为主,能够直接使用如今市面上的一些现有深度学习框架,如今流行的深度学习框架有MXnet,tensorflow,caffe等,本文主要介绍MXnet这个开源的优秀深度学习框架。
这里咱们安装的是CPU版的MXnet,为何不安装GPU版?由于偶的Macbook是AMD的卡啊,MXnet只支持CUDA
1.下载源码
新建一个目录,到那个目录下执行
git clone --recursive https://github.com/dmlc/mxnet
2.编译安装
运行setup-utils目录下的install-mxnet-osx.sh脚本,中间要编译些东西,要多等会,再输入个密码,就自动编译安装完成啦。
注意一下:
1.由于要读取make目录下的文件,因此这里要在MXnet源码的根目录执行安装脚本~
好比在mxnet的源码根目录执行
sh ./setup-utils/install-mxnet-osx.sh
2.之后运行脚本可能须要一些python模块,建议安装下pip
mac下安装的方法也很简单: sudo easy_install pip
咱们能够试着运行下MXnet自带的一些样例,这里咱们试下Neural art这个样例
Neural art是个让机器模仿已有画做的绘画风格来把一张照片从新绘画的算法。
好比咱们输入
和
最终生成
1.首先打开example/neural-style目录,大部分样例都是有README的,你们在运行以前能够先看看
这个样例的README有说
First usedownload.sh
to download pre-trained model and sample inputs Then runpython nstyle.py
, use-h
to see more options
那咱们就要运行这个目录下的download.sh
脚本会自动下载训练模型vgg19.params到Model目录,输入的素材到input目录
2.运行Demo
由于咱们运行的是CPU版,因此要这么输入
python nstyle.py --gpu -1 --max-num-epochs 150 --output_dir ~/Desktop/
--gpu:使用哪一个一个GPU,-1表明使用CPU
--max-num-epochs:最大迭代次数,这里咱们迭代150次
--output_dir:结果输出路径
可能你们一次运行不起来,会出现No module named for xxx的提示,通常是相应的python模块没有安装,在google搜下No module named for xxx通常都能找到安装方法,大部分都能经过pip安装~
运行结果
咱们看下不一样迭代次数时的结果是什么样的
10次:
50次:
100次:
150次:
能够看出迭代次数越多效果越好~固然因为深度学习是有不少层神经网络组成,须要的运算量巨大,使用CPU即便是i7,150次迭代也须要好几十分钟了,有条件的看官能够尝试使用GPU版,能够将时间缩短到几分钟,甚至在云平台上跑。
样例的具体原理能够参考参考附录的第二个连接。
参考附录:
http://www.leiphone.com/news/...
此文已由做者受权腾讯云+社区在各渠道发布
获取更多新鲜技术干货,能够关注咱们腾讯云技术社区-云加社区官方号及知乎机构号