导语: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 surrounds us and love to share and build something together. That makes science a highly satisfying activity, emotionally speaking! ——Yoshua Bengio

 

人工智能的浪潮正席卷全球,诸多词汇时刻萦绕在我们的耳边,如人工智能,机器学习深度学习等。“人工智能”的概念早在 1956 年就被提出,顾名思义用计算机来构造复杂的,拥有与人类智慧同样本质特性的机器。经过几十年的发展,在 2012 年后,得益于数据量的上涨,运算力的提升和机器学习算法(深度学习)的出现,人工智能开始大爆发。但目前的科研工作都集中在弱人工智能部分,即让机器具备观察和感知能力,可以一定程度的理解和推理,预期在该领域能够取得一些重大突破。电影里的人工智能多半都是在描绘强人工智能,即让机器获得自适应能力,解决一些之前还没遇到过的问题,而这部分在目前的现实世界里难以真正实现。

 

若人工智能有希望取得突破,是如何实现的,“智能”又从何而来呢?这主要归功于一种实现人工智能的方法——机器学习。

 

一、机器学习概念

机器学习一种实现人工智能的方法。

 

机器学习最基本的做法是,使用算法来解析数据从中学习,然后对真实世界中的事件做出决策和预测。与传统的为解决特定任务、硬编码的软件程序不同,机器学习是用大量的数据来“训练”,通过各种算法从数据中学习如何完成任务。机器学习源于早期的人工智能领域,传统的算法包括决策树、聚类、贝叶斯分类、支持向量机、EM、Adaboost 等等。从学习方法上来分,机器学习算法可以分为监督学习(如分类问题)、无监督学习(如聚类问题)、半监督学习、集成学习、深度学习和强化学习。

 

传统的机器学习算法在指纹识别、基于 Haar 的人脸检测、基于 HoG 特征的物体检测等领域的应用基本达到了商业化的要求或者特定场景的商业化水平,但每前进一步都异常艰难,直到深度学习算法的出现。

 

二、深度学习概念

深度学习是一种实现机器学习的技术。

 

其本身并不是一种独立的学习方法,也会用到有监督和无监督的学习方法来训练深度神经网络。但由于近几年该领域发展迅猛,一些特有的学习手段相继被提出(如残差网络),因此越来越多的人将其单独看作一种学习的方法。

 

最初的深度学习是利用深度神经网络来解决特征表达的一种学习过程。深度神经网络本身并不是一个全新的概念,可大致理解为包含多个隐含层的神经网络结构。为了提高深层神经网络的训练效果,人们对神经元的连接方法和激活函数等方面做出相应的调整。其实有不少想法早年间也曾有过,但由于当时训练数据量不足、计算能力落后,因此最终的效果不尽如人意。深度学习,作为目前最热的机器学习方法,但并不意味着是机器学习的终点。起码目前存在以下问题:

1、深度学习模型需要大量的训练数据,才能展现出神奇的效果,但现实生活中往往会遇到小样本问题,此时深度学习方法无法入手,传统的机器学习方法就可以处理;

2、有些领域,采用传统的简单的机器学习方法,可以很好地解决了,没必要非得用复杂的深度学习方法;

3、深度学习的思想,来源于人脑的启发,但绝不是人脑的模拟。

 

因此,机器学习框架和深度学习框架之间也是有区别的。本质上,机器学习框架涵盖用于分类,回归,聚类,异常检测和数据准备的各种学习方法,也可以包括神经网络方法。深度学习或深度神经网络(DNN)框架涵盖具有许多隐藏层的各种神经网络拓扑,包括模式识别的多步骤过程。网络中的层越多,可以提取用于聚类和分类的特征越复杂。常见的 Caffe,CNTK,DeepLearning4j,Keras,MXNet 和 TensorFlow 是深度学习框架。 而 Scikit-learning 和 Spark MLlib 是机器学习框架。 Theano 则跨越了这两个类别。

 

本文接下来的篇幅将会重点介绍深度学习的三个框架 caffe、tensorflow 和 keras,如果只是需要使用传统的机器学习基础算法使用 scikit-learning 和 spark MLlib 则更为合适。

 

三、深度学习框架比较

神经网络一般包括:训练,测试两大阶段。训练就是把训练数据和神经网络模型(AlexNet、RNN 等神经网络训练框架 Caffe 等)用 CPU 或 GPU 提炼出模型参数的过程。测试就是把测试数据用训练好的模型(神经网络模型+模型参数)运行后查看结果。而 caffe,keras,tensorflow 就是把训练过程所涉及的环节数据统一抽象,形成可使用框架。

 

(一)Caffe

1、概念

Caffe 是一个清晰而高效的深度学习框架,也是一个被广泛使用的开源深度学习框架,在 Tensorflow 出现之前一直是深度学习领域 Github star 最多的项目。主要优势为:上手容易,网络结构都是以配置文件形式定义,不需要用代码设计网络。训练速度快,组件模块化,可以方便的拓展到新的模型和学习任务上。但是 Caffe 最开始设计时的目标只针对于图像,没有考虑文本、语音或者时间序列的数据,因此 Caffe 对卷积神经网络的支持非常好,但是对于时间序列 RNN,LSTM 等支持的不是特别充分。Caffe 工程的 models 文件夹中常用的网络模型比较多,比如 Lenet、AlexNet、ZFNet、VGGNet、GoogleNet、ResNet 等。

 

2、Caffe 的模块结构

Caffe 由低到高依次把网络中的数据抽象成 Blob, 各层网络抽象成 Layer ,整个网络抽象成 Net,网络模型的求解方法抽象成 Solver。

 

1.Blob 表示网络中的数据,包括训练数据,网络各层自身的参数,网络之间传递的数据都是通过 Blob 来实现的,同时 Blob 数据也支持在 CPU 与 GPU 上存储,能够在两者之间做同步。

 

2.Layer 是对神经网络中各种层的抽象,包括卷积层和下采样层,还有全连接层和各种激活函数层等。同时每种 Layer 都实现了前向传播和反向传播,并通过 Blob 来传递数据。

 

3.Net 是对整个网络的表示,由各种 Layer 前后连接组合而成,也是所构建的网络模型。

 

4.Solver 定义了针对 Net 网络模型的求解方法,记录网络的训练过程,保存网络模型参数,中断并恢复网络的训练过程。自定义 Solver 能够实现不同的网络求解方式。

 

3、安装方式

Caffe 需要预先安装比较多的依赖项,CUDA,snappy,leveldb,gflags,glog,szip,lmdb,OpenCV,hdf5,BLAS,boost、ProtoBuffer 等;

Caffe 官网:https://caffe.berkeleyvision.org/;

Caffe Github : https://github.com/BVLC/caffe;Caffe 安装教程:

https://caffe.berkeleyvision.org/installation.html,

https://blog.csdn.net/yhaolpz/article/details/71375762;

Caffe 安装分为 CPU 和 GPU 版本,GPU 版本需要显卡支持以及安装 CUDA

4、使用 Caffe 搭建神经网络

 

 

【caffe 搭建神经网络流程图】

 

在上述流程中,步骤 2 是核心操作,也是 caffe 使用最让人头痛的地方,keras 则对该部分做了更高层的抽象,让使用者能够快速编写出自己想要实现的模型。

 

(二) Tensorflow

1、概念

TensorFlow 是一个使用数据流图进行数值计算的开源软件库。图中的节点表示数学运算,而图边表示节点之间传递的多维数据阵列(又称张量)。灵活的体系结构允许使用单个 API 将计算部署到服务器或移动设备中的某个或多个 CPU 或 GPU。Tensorflow 涉及相关概念解释如下:

 

1)符号计算

符号计算首先定义各种变量,然后建立一个“计算图”,图中规定了各个变量之间的计算关系。 符号计算也叫数据流图,其过程如下图 2-1 所示,数据是按图中黑色带箭头的线流动的。

 


【2-1 数据流图示例】

 

数据流图用“结点”(nodes)和“线”(edges)的有向图来描述数学计算。

 

① “节点” 一般用来表示施加的数学操作,但也可以表示数据输入(feed in)的起点 / 输出(push out)的终点,或者是读取 / 写入持久变量(persistent variable)的终点。

② “线”表示“节点”之间的输入 / 输出关系。

③ 在线上流动的多维数据阵列被称作“张量”。

 

2)张量

张量(tensor),可以看作是向量、矩阵的自然推广,用来表示广泛的数据类型,张量的阶数也叫维度。

 

0 阶张量,即标量,是一个数。1 阶张量,即向量,是一组有序排列的数。2 阶张量,即矩阵,是一组向量有序的排列起来。3 阶张量,即立方体,是一组矩阵上下排列起来。以此类推。

 

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 的位置不一样。

 

2、Tensorflow 的模块结构

Tensorflow/core 目录包含了 TF 核心模块代码,具体结构如图 2-2 所示:

 


【图 2-2 tensorflow 代码模块结构】

 

3、安装方式

1、官网下载 naconda 安装:https://www.anaconda.com/download/;

 

2、依次在 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。

 

4、使用 Tensorflow 搭建神经网络

使用 Tensorflow 搭建神经网络主要包含以下 6 个步骤:

1) 定义添加神经层的函数;

2) 准备训练的数据;

3) 定义节点准备接收数据;

4) 定义神经层:隐藏层和预测层;

5) 定义 loss 表达式;

6) 选择 optimizer 使 loss 达到最小;

7) 对所有变量进行初始化,通过 sess.run optimizer,迭代多次进行学习。

5、示例代码

Tensorflow 构建神经网络识别手写数字,具体代码如下所示:

import tensorflow as tfimport 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 optimizerfor 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

1、概念

Keras 由纯 Python 编写而成并基于 Tensorflow、Theano 以及 CNTK 后端,相当于 Tensorflow、Theano、CNTK 的上层接口,号称 10 行代码搭建神经网络,具有操作简单、上手容易、文档资料丰富、环境配置容易等优点,简化了神经网络构建代码编写的难度。目前封装有全连接网络、卷积神经网络、RNN 和 LSTM 等算法。

 

Keras 有两种类型的模型,序贯模型(Sequential)和函数式模型(Model),函数式模型应用更为广泛,序贯模型是函数式模型的一种特殊情况。

 

1) 序贯模型(Sequential):单输入单输出,一条路通到底,层与层之间只有相邻关系,没有跨层连接。这种模型编译速度快,操作也比较简单。

 

2) 函数式模型(Model):多输入多输出,层与层之间任意连接。这种模型编译速度慢。

 

2、Keras 的模块结构

Keras 主要由 5 大模块构成,模块之间的关系及每个模块的功能如图 3-1 所示:

 

【图 3-1 keras 模块结构图】

 

3、安装方式

Keras 的安装为以下三个步骤:

1) 安装 anaconda(python);

2) 用于科学计算的 python 发行版,支持 Linux、Mac、Windows 系统,提供了包管理与环境管理的功能,可以很方便的解决多版本 python 并存、切换以及各种第三方包安装问题;

3) 利用 pip 或者 conda 安装 numpy、keras、 pandas、tensorflow 等库;

下载地址: https://www.anaconda.com/what-is-anaconda/。

 

4、使用 Keras 搭建神经网络

使用 keras 搭建一个神经网络,包括 5 个步骤,分别为模型选择、构建网络层、编译、训练和预测。每个步骤操作过程中使用到的 keras 模块如图 3-2 所示:

 


【3-2 使用 keras 搭建神经网络步骤】

5、示例代码

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)))

 

(四)框架优缺点对比

 

 

参考文章

[1]. https://www.zhihu.com/question/57770020/answer/249708509   人工智能、机器学习和深度学习的区别?

[2]. https://km.oa.com/group/25254/articles/show/325228?kmref=search&from_page=1&no=1   从入门到吃鸡—基于 Caffe 框架 AI 图像识别自动化

[3]. https://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]. https://biog.csdn.net/sinat_26917383

[7]. https://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 必须要搞清楚

声明:本文来自腾讯 Bugly,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如需转载,请联系原作者获取授权。