Science is NOT a battle, it is a collaboration. We all build on each other's ideas. Science is an act of love, not war. Love for the beauty in the world that surr ounds us and love to share and build something together. That makes science a highly satisfying activity, emotionally speaking! html
——Yoshua Bengionode
人工智能的浪潮正席卷全球,诸多词汇时刻萦绕在咱们的耳边,如人工智能,机器学习,深度学习等。“人工智能”的概念早在1956年就被提出,顾名思义用计算机来构造复杂的,拥有与人类智慧一样本质特性的机器。通过几十年的发展,在2012年后,得益于数据量的上涨,运算力的提高和机器学习算法(深度学习)的出现,人工智能开始大爆发。但目前的科研工做都集中在弱人工智能部分,即让机器具有观察和感知能力,能够必定程度的理解和推理,预期在该领域可以取得一些重大突破。电影里的人工智能多半都是在描绘强人工智能,即让机器得到自适应能力,解决一些以前还没遇到过的问题,而这部分在目前的现实世界里难以真正实现。python
弱人工智能有但愿取得突破,是如何实现的,“智能”又从何而来呢?这主要归功于一种实现人工智能的方法——机器学习。git
机器学习是一种实现人工智能的方法。github
机器学习最基本的作法,是使用算法来解析数据、从中学习,而后对真实世界中的事件作出决策和预测。与传统的为解决特定任务、硬编码的软件程序不一样,机器学习是用大量的数据来“训练”,经过各类算法从数据中学习如何完成任务。器学习直接来源于早期的人工智能领域,传统的算法包括决策树、聚类、贝叶斯分类、支持向量机、EM、Adaboost等等。从学习方法上来分,机器学习算法能够分为监督学习(如分类问题)、无监督学习(如聚类问题)、半监督学习、集成学习、深度学习和强化学习。算法
传统的机器学习算法在指纹识别、基于Haar的人脸检测、基于HoG特征的物体检测等领域的应用基本达到了商业化的要求或者特定场景的商业化水平,但每前进一步都异常艰难,直到深度学习算法的出现。编程
深度学习是一种实现机器学习的技术。windows
深度学习原本并非一种独立的学习方法,其自己也会用到有监督和无监督的学习方法来训练深度神经网络。但因为近几年该领域发展迅猛,一些特有的学习手段相继被提出(如残差网络),所以愈来愈多的人将其单独看做一种学习的方法。后端
最初的深度学习是利用深度神经网络来解决特征表达的一种学习过程。深度神经网络自己并非一个全新的概念,可大体理解为包含多个隐含层的神经网络结构。为了提升深层神经网络的训练效果,人们对神经元的链接方法和激活函数等方面作出相应的调整。其实有很多想法早年间也曾有过,但因为当时训练数据量不足、计算能力落后,所以最终的效果不尽如人意。服务器
深度学习,做为目前最热的机器学习方法,但并不意味着是机器学习的终点。起码目前存在如下问题:
1) 深度学习模型须要大量的训练数据,才能展示出神奇的效果,但现实生活中每每会遇到小样本问题,此时深度学习方法没法入手,传统的机器学习方法就能够处理;
2) 有些领域,采用传统的简单的机器学习方法,能够很好地解决了,不必非得用复杂的深度学习方法;
3) 深度学习的思想,来源于人脑的启发,但毫不是人脑的模拟。
所以,机器学习框架和深度学习框架之间也是有区别的。本质上,机器学习框架涵盖用于分类,回归,聚类,异常检测和数据准备的各类学习方法,而且其能够或能够不包括神经网络方法。深度学习或深度神经网络(DNN)框架涵盖具备许多隐藏层的各类神经网络拓扑。这些层包括模式识别的多步骤过程。网络中的层越多,能够提取用于聚类和分类的特征越复杂。咱们常见的Caffe,CNTK,DeepLearning4j,Keras,MXNet和TensorFlow是深度学习框架。 Scikit-learning和Spark MLlib是机器学习框架。 Theano跨越了这两个类别。
本文接下来的篇幅将会重点介绍深度学习的三个框架caffe、tensorflow和keras,若是只是须要使用传统的机器学习基础算法使用scikit-learning和spark MLlib则更为合适。
神经网络通常包括:训练,测试两大阶段。训练:就是把训练数据(原料)和神经网络模型:如AlexNet、RNN等“倒进” 神经网络训练框架例如cafffe等而后用 CPU或GPU(真火) “提炼出” 模型参数(仙丹)的过程。测试:就是把测试数据用训练好的模型(神经网络模型 + 模型参数)跑一跑看看结果如何,做为炼丹炉caffe,keras,tensorflow就是把炼制过程所涉及的概念作抽象,造成一套体系。
Caffe是一个清晰而高效的深度学习框架,也是一个被普遍使用的开源深度学习框架,在Tensorflow出现以前一直是深度学习领域Github star最多的项目。
Caffe的主要优点为:容易上手,网络结构都是以配置文件形式定义,不须要用代码设计网络。训练速度快,组件模块化,能够方便的拓展到新的模型和学习任务上。可是Caffe最开始设计时的目标只针对于图像,没有考虑文本、语音或者时间序列的数据,所以Caffe对卷积神经网络的支持很是好,可是对于时间序列RNN,LSTM等支持的不是特别充分。caffe工程的models文件夹中经常使用的网络模型比较多,好比Lenet、AlexNet、ZFNet、VGGNet、GoogleNet、ResNet等。
总的来说,由低到高依次把网络中的数据抽象成Blob, 各层网络抽象成 Layer ,整个网络抽象成Net,网络模型的求解方法 抽象成 Solver。
1) Blob 主要用来表示网络中的数据,包括训练数据,网络各层自身的参数,网络之间传递的数据都是经过 Blob 来实现的,同时 Blob 数据也支持在 CPU 与 GPU 上存储,可以在二者之间作同步。
2) Layer 是对神经网络中各类层的一个抽象,包括咱们熟知的卷积层和下采样层,还有全链接层和各类激活函数层等等。同时每种 Layer 都实现了前向传播和反向传播,并经过 Blob 来传递数据。
3) Net 是对整个网络的表示,由各类 Layer 先后链接组合而成,也是咱们所构建的网络模型。
4) Solver 定义了针对 Net 网络模型的求解方法,记录网络的训练过程,保存网络模型参数,中断并恢复网络的训练过程。自定义 Solver 可以实现不一样的网络求解方式。
Caffe 须要预先安装比较多的依赖项,CUDA,snappy,leveldb,gflags,glog,szip,lmdb,OpenCV,hdf5,BLAS,boost等等
Caffe官网:http://caffe.berkeleyvision.org/
Caffe Github : https://github.com/BVLC/caffe
Caffe 安装教程:http://caffe.berkeleyvision.org/installation.html http://blog.csdn.net/yhaolpz/article/details/71375762
Caffe 安装分为CPU和GPU版本,GPU版本须要显卡支持以及安装CUDA。
Caffe依赖 ProtoBuffer Boost GFLAGS GLOG BLAS HDF5 OpenCV LMDB LEVELDB Snappy
表 3-1 caffe搭建神经网络流程
使用流程 |
操做说明 |
一、数据格式处理 |
将数据处理成caffe支持格式,具体包括:LEVELDB,LMDB,内存数据,hdfs数据,图像数据,windows,dummy等。 |
二、编写网络结构文件 |
定义网络结构,如当前网络包括哪几层,每层做用是什么,使用caffe过程当中最麻烦的一个操做步骤。具体编写格式可参考caffe框架自带自动识别手写体样例:caffe/examples/mnist/lenet_train_test.prototxt。 |
三、编写网络求解文件 |
定义了网络模型训练过程当中须要设置的参数,好比学习率,权重衰减系数,迭代次数,使用GPU仍是CP等,通常命名方式为xx_solver.prototxt,可参考:caffe/examples/mnist/lenet_solver.prototxt。 |
四、训练 |
基于命令行的训练,如:caffe train -solver examples/mnist/lenet_solver.prototxt |
五、测试 |
caffe test -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000.caffemodel -gpu 0 -iterations 100 |
在上述流程中,步骤2是核心操做,也是caffe使用最让人头痛的地方,keras则对该部分作了更高层的抽象,让使用者可以快速编写出本身想要实现的模型。
TensorFlow是一个使用数据流图进行数值计算的开源软件库。图中的节点表示数学运算,而图边表示在它们之间传递的多维数据阵列(又称张量)。灵活的体系结构容许你使用单个API将计算部署到桌面、服务器或移动设备中的一个或多个CPU或GPU。Tensorflow涉及相关概念解释以下:
1)符号计算
符号计算首先定义各类变量,而后创建一个“计算图”,计算图规定了各个变量之间的计算关系。 符号计算也叫数据流图,其过程以下图3-1所示,数据是按图中黑色带箭头的线流动的。
图 3-1 数据流图示例
数据流图用“结点”(nodes)和“线”(edges)的有向图来描述数学计算。
① “节点” 通常用来表示施加的数学操做,但也能够表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点。
② “线”表示“节点”之间的输入/输出关系。
③ 在线上流动的多维数据阵列被称做“张量”。
2)张量
张量(tensor),能够看做是向量、矩阵的天然推广,用来表示普遍的数据类型。张量的阶数也叫维度。
0阶张量,即标量,是一个数。
1阶张量,即向量,一组有序排列的数
2阶张量,即矩阵,一组向量有序的排列起来
3阶张量,即立方体,一组矩阵上下排列起来
4阶张量......
依次类推
3)数据格式(data_format)
目前主要有两种方式来表示张量:
① th模式或channels_first模式,Theano和caffe使用此模式。
② tf模式或channels_last模式,TensorFlow使用此模式。
下面举例说明两种模式的区别:
对于100张RGB3通道的16×32(高为16宽为32)彩色图,
th表示方式:(100,3,16,32)
tf表示方式:(100,16,32,3)
惟一的区别就是表示通道个数3的位置不同。
Tensorflow/core目录包含了TF核心模块代码,具体结构如图3-2所示:
图 3-2 tensorflow代码模块结构
一、官网下载naconda安装:https://www.anaconda.com/download/
二、依次在Anaconda Prompt控制台,按如下5个步骤输入指令进行安装:
1) 安装py3+ cmd : conda create -n py3.6 python=3.6 anaconda
2) 激活虚拟环境 cmd : activate py3.6
3) 激活TSF预安装cmd:
conda create -n tensorflow python=3.6
activate tensorflow
4) 安装TSF:
pip install --ignore-installed --upgrade tensorflow
pip install --ignore-installed --upgrade tensorflow-gpu
5) 退出虚拟环境cmd :deactivate py3.6
使用Tensorflow搭建神经网络主要包含如下6个步骤:
1) 定义添加神经层的函数
2) 准备训练的数据
3) 定义节点准备接收数据
4) 定义神经层:隐藏层和预测层
5) 定义 loss 表达式
6) 选择 optimizer 使 loss 达到最小
7) 对全部变量进行初始化,经过 sess.run optimizer,迭代屡次进行学习。
Tensorflow 构建神经网络识别手写数字,具体代码以下所示:
import tensorflow as tf import numpy as np # 添加层 def add_layer(inputs, in_size, out_size, activation_function=None): # add one more layer and return the output of this layer Weights = tf.Variable(tf.random_normal([in_size, out_size])) biases = tf.Variable(tf.zeros([1, out_size]) + 0.1) Wx_plus_b = tf.matmul(inputs, Weights) + biases if activation_function is None: outputs = Wx_plus_b else: outputs = activation_function(Wx_plus_b) return outputs # 1.训练的数据 # Make up some real data x_data = np.linspace(-1,1,300)[:, np.newaxis] noise = np.random.normal(0, 0.05, x_data.shape) y_data = np.square(x_data) - 0.5 + noise # 2.定义节点准备接收数据 # define placeholder for inputs to network xs = tf.placeholder(tf.float32, [None, 1]) ys = tf.placeholder(tf.float32, [None, 1]) # 3.定义神经层:隐藏层和预测层 # add hidden layer 输入值是 xs,在隐藏层有 10 个神经元 l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu) # add output layer 输入值是隐藏层 l1,在预测层输出 1 个结果 prediction = add_layer(l1, 10, 1, activation_function=None) # 4.定义 loss 表达式 # the error between prediciton and real data loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction), reduction_indices=[1])) # 5.选择 optimizer 使 loss 达到最小 # 这一行定义了用什么方式去减小 loss,学习率是 0.1 train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) # important step 对全部变量进行初始化 init = tf.initialize_all_variables() sess = tf.Session() # 上面定义的都没有运算,直到 sess.run 才会开始运算 sess.run(init) # 迭代 1000 次学习,sess.run optimizer for i in range(1000): # training train_step 和 loss 都是由 placeholder 定义的运算,因此这里要用 feed 传入参数 sess.run(train_step, feed_dict={xs: x_data, ys: y_data}) if i % 50 == 0: # to see the step improvement print(sess.run(loss, feed_dict={xs: x_data, ys: y_data}))
Keras由纯Python编写而成并基于Tensorflow、Theano以及CNTK后端,至关于Tensorflow、Theano、 CNTK的上层接口,号称10行代码搭建神经网络,具备操做简单、上手容易、文档资料丰富、环境配置容易等优势,简化了神经网络构建代码编写的难度。目前封装有全链接网络、卷积神经网络、RNN和LSTM等算法。
Keras有两种类型的模型,序贯模型(Sequential)和函数式模型(Model),函数式模型应用更为普遍,序贯模型是函数式模型的一种特殊状况。
1) 序贯模型(Sequential):单输入单输出,一条路通到底,层与层之间只有相邻关系,没有跨层链接。这种模型编译速度快,操做也比较简单
2) 函数式模型(Model):多输入多输出,层与层之间任意链接。这种模型编译速度慢。
Keras主要由5大模块构成,模块之间的关系及每一个模块的功能如图3-3所示:
图 3-3 keras模块结构图
Keras的安装方式有如下三个步骤:
1) 安装anaconda(python)
2) 用于科学计算的python发行版,支持Linux、Mac、Windows系统,提供了包管理与环境管理的功能,能够很方便的解决多版本python并存、切换以及各类第三方包安装问题。
3) 利用pip或者conda安装numpy、keras、 pandas、tensorflow等库
下载地址: https://www.anaconda.com/what-is-anaconda/
使用keras搭建一个神经网络,包括5个步骤,分别为模型选择、构建网络层、编译、训练和预测。每一个步骤操做过程当中使用到的keras模块如图3-4所示。
图 3-4 使用keras搭建神经网络步骤
Kears构建神经网络识别手写数字,具体代码以下所示:
from keras.models import Sequential from keras.layers.core import Dense, Dropout, Activation from keras.optimizers import SGD from keras.datasets import mnist import numpy ''' 第一步:选择模型 ''' model = Sequential() ''' 第二步:构建网络层 ''' model.add(Dense(500,input_shape=(784,))) # 输入层,28*28=784 model.add(Activation('tanh')) # 激活函数是tanh model.add(Dropout(0.5)) # 采用50%的dropout model.add(Dense(500)) # 隐藏层节点500个 model.add(Activation('tanh')) model.add(Dropout(0.5)) model.add(Dense(10)) # 输出结果是10个类别,因此维度是10 model.add(Activation('softmax')) # 最后一层用softmax做为激活函数 ''' 第三步:编译 ''' sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) # 优化函数,设定学习率(lr)等参数 model.compile(loss='categorical_crossentropy', optimizer=sgd, class_mode='categorical') # 使用交叉熵做为loss函数 ''' 第四步:训练 .fit的一些参数 batch_size:对总的样本数进行分组,每组包含的样本数量 epochs :训练次数 shuffle:是否把数据随机打乱以后再进行训练 validation_split:拿出百分之多少用来作交叉验证 verbose:屏显模式 0:不输出 1:输出进度 2:输出每次的训练结果 ''' (X_train, y_train), (X_test, y_test) = mnist.load_data() # 使用Keras自带的mnist工具读取数据(第一次须要联网) # 因为mist的输入数据维度是(num, 28, 28),这里须要把后面的维度直接拼起来变成784维 X_train = X_train.reshape(X_train.shape[0], X_train.shape[1] * X_train.shape[2]) X_test = X_test.reshape(X_test.shape[0], X_test.shape[1] * X_test.shape[2]) Y_train = (numpy.arange(10) == y_train[:, None]).astype(int) Y_test = (numpy.arange(10) == y_test[:, None]).astype(int) model.fit(X_train,Y_train,batch_size=200,epochs=50,shuffle=True,verbose=0,validation_split=0.3) model.evaluate(X_test, Y_test, batch_size=200, verbose=0) ''' 第五步:输出 ''' print("test set") scores = model.evaluate(X_test,Y_test,batch_size=200,verbose=0) print("") print("The test loss is %f" % scores) result = model.predict(X_test,batch_size=200,verbose=0) result_max = numpy.argmax(result, axis = 1) test_max = numpy.argmax(Y_test, axis = 1) result_bool = numpy.equal(result_max, test_max) true_num = numpy.sum(result_bool) print("") print("The accuracy of the model is %f" % (true_num/len(result_bool)))
表 3-2 深度学习框架对比
对比维度 |
Caffe |
Tensorflow |
Kears |
上手难度 |
一、 不用不写代码,只需在.prototxt文件中定义网络结构就能够完成模型训练。 二、 安装过程复杂,且在.prototxt 文件内部设计网络节构比较受限,没有在 Python 中设计网络结构方便、自由。配置文件不能用编程的方式调整超参数,对交叉验证、超参数Grid Search 等操做没法很方便的支持。 |
一、 安装简单,教学资源丰富,根据样例能快速搭建出基础模型。 二、 有必定的使用门槛。无论是编程范式,仍是数学统计基础,都为非机器学习与数据科学背景的伙伴们带来必定的上手难度。另外,是一个相对低层的框架,使用时须要编写大量的代码,从新发明轮子。 |
一、安装简单,它旨在让用户进行最快速的原型实验,让想法变为结果的这个过程最短,很是适合最前沿的研究。 二、API使用方便,用户只须要将高级的模块拼在一块儿,就能够设计神经网络,下降了编程和阅读别人代码时的理解开销 |
框架维护 |
在 TensorFlow 出现以前一直是深度学习领域 GitHub star 最多的项目,前由伯克利视觉学中心(Berkeley Vision and Learning Center,BVLC)进行维护。 |
被定义为“最流行”、“最被承认”的开源深度学习框架, 拥有产品级的高质量代码,有 Google 强大的开发、维护能力的加持,总体架构设计也很是优秀。 |
开发主要由谷歌支持, API以“tf.keras"的形式打包在TensorFlow中。微软维护着Keras的CNTK后端。亚马逊AWS正在开发MXNet支持。其余提供支持的公司包括NVIDIA、优步、苹果(经过CoreML) |
支持语言 |
C++/Cuda |
C++ python (Go,Java,Lua,Javascript,或者是R) |
Python |
封装算法 |
一、对卷积神经网络的支持很是好,拥有大量的训练好的经典模型(AlexNet、VGG、Inception)乃至其余 state-of-the-art (ResNet等)的模型,收藏在它的 Model Zoo。 二、对时间序列 RNN、LSTM 等支持得不是特别充分 |
一、支持CNN与RNN, 还支持深度强化学习乃至其余计算密集的科学计算(如偏微分方程求解等)。 二、计算图必须构建为静态图,这让不少计算变得难以实现,尤为是序列预测中常用的 beam search。 |
一、专精于深度学习,支持卷积网络和循环网络,支持级联的模型或任意的图结构的模型,从 CPU 上计算切换到 GPU 加速无须任何代码的改动。 二、没有加强学习工具箱,本身修改实现很麻烦。封装得过高级,训练细节不能修改、penalty细节很难修改。 |
模型部署 |
一、程序运行很是稳定,代码质量比较高,很适合对稳定性要求严格的生产环境,第一个主流的工业级深度学习框架。Caffe 的底层基于 C++,能够在各类硬件环境编译并具备良好的移植性,支持 Linux、Mac 和 Windows 系统,也能够编译部署到移动设备系统如 Android 和 iOS 上。 |
一、为生产环境设计的高性能的机器学习服务系统,能够同时运行多个大规模深度学习模型,支持模型生命周期管理、算法实验,并能够高效地利用 GPU 资源,让训练好的模型更快捷方便地投入到实际生产环境。灵活的移植性,能够将同一份代码几乎不通过修改就轻松地部署到有任意数量 CPU 或 GPU 的 PC、服务器或者移动设备上。 |
一、使用TensorFlow、CNTK、Theano做为后端,简化了编程的复杂度,节约了尝试新网络结构的时间。模型越复杂,收益越大,尤为是在高度依赖权值共享、多模型组合、多任务学习等模型上,表现得很是突出。 |
性能 |
目前仅支持单机多 GPU 的训练,不支持分布式的训练。 |
一、 支持分布式计算,使 GPU 集群乃至 TPU 集群并行计算,共同训练出一个模型。 二、 对不一样设备间的通讯优化得不是很好,分布式性能尚未达到最优。 |
没法直接使用多 GPU,对大规模的数据处理速度没有其余支持多 GPU 和分布式的框架快。用TensorFLow backend时速度比纯TensorFLow 下要慢不少。 |
如表3-2对比维度所示,对于刚入门机器学习的新手而已,keras无疑是最好的选择,可以快速搭建模型验证想法。随着对机型学习的理解逐步加深,业务模型愈来愈复杂时,能够根据实际须要转到Tensorflow或Caffe。
深度学习的研究在持续进行中,一直与其它经典机器学习算法并存,各种深度学习框架也是遍地开花,各有偏向,优劣各异,具体用哪一种要根据应用场景灵活选择。正如本文导语所言,科学不是战争而是合做。任何学科的发展历来都不是一条路走到黑,而是同行之间互相学习、互相借鉴、博采众长、相得益彰,站在巨人的肩膀上不断前行。对机器学习和深度学习的研究也是同样,你死我活那是邪教,开放包容才是正道!
最后,文章内容多摘自网上广大网友的贡献,如所写内容涉及他人著做且未进行参考引用,那必定是我遗漏了,很是抱歉,还请及时联系我进行修正,万分感谢!。
[1]. https://www.zhihu.com/question/57770020/answer/249708509 人工智能、机器学习和深度学习的区别?
[2] . http://km.oa.com/group/25254/articles/show/325228?kmref=search&from_page=1&no=1 从入门到吃鸡--基于Caffe 框架AI图像识别自动化
[3]. http://blog.luoyetx.com/2015/10/reading-caffe-1/
[4]. https://zhuanlan.zhihu.com/p/24087905 Caffe入门与实践-简介
[5]. https://keras-cn.readthedocs.io/en/latest/for_beginners/FAQ/ keras官网
[6]. http://biog.csdn.net/sinat_26917383
[7]. http://www.cnblogs.com/lc1217/p/7132364.html 深度学习:Keras入门(一)之基础篇
[8]. https://www.jianshu.com/p/e112012a4b2d 一文学会用 Tensorflow 搭建神经网络
[9]. https://www.zhihu.com/question/42061396/answer/93827994 深度学习会不会淘汰掉其余全部机器学习算法?
[10]. https://www.leiphone.com/news/201702/T5e31Y2ZpeG1ZtaN.html TensorFlow和Caffe、MXNet、Keras等其余深度学习框架的对比
[11]. https://chenrudan.github.io/blog/2015/11/18/comparethreeopenlib.html Caffe、TensorFlow、MXnet三个开源库对比
[12]. https://zhuanlan.zhihu.com/p/24687814 对比深度学习十大框架:TensorFlow最流行但并非最好
[13]. https://www.leiphone.com/news/201704/8RWdnz9dQ0tyoexF.html 万事开头难!入门TensorFlow,这9个问题TF Boys 必需要搞清楚