【开源框架】【TensorFlow】一篇文章快速读懂TensorFlow,一张导图深度理解机器学习

2017 年 10 月 16 日 产业智能官 中国统计网

人工智能、机器学习和深度学习

在介绍TensorFlow(以下简称为TF)之前,我们首先了解一下相关背景。

TF是一种机器学习框架,而机器学习经常和人工智能,深度学习联系在一起,那么三者到底是什么关系呢?

简单来讲三者可以理解为包含于被包含的关系。其中最大的是人工智能(以下简称为AI),AI最早起源于1956年的达特茅斯会议,当时AI的几位先驱在会上展示了最早的AI程序:Logic Theorist,能够自动推导数学原理第二章前52个定理中的38个,甚至其中一个定理的证明过程比书中给出的还要优雅,他们甚至曾尝试要发表这一新的证明方式(不过后来被拒了)。总之,简单来说,AI就是赋予机器以人的智能,让机器具有学习和认知的能力。

机器学习(以下简称为ML)则是实现AI的一种方法。举个简单的垃圾邮件过滤的例子,我们人类判断一个邮件是否是垃圾邮件很简单,通过标题或内容很快就可以辨别。但是让机器完成这样的任务就没这么简单。对于经典的ML算法,首先需要从原始数据(邮件)中提取特征,比如发信人地址、邮件标题、邮件内容关键词等,从而将文字的邮件转换成包含多个特征的向量,然后利用逻辑回归算法在已经标定的数据集上进行训练,得到每个特征的权重。这些权重构成我们的预测模型,对于一封新的邮件,就可以用这个模型判断其是否是垃圾邮件。

传统的ML最大的问题就是特征提取。比如让机器识别照片中的动物是猫还是狗,如何设计特征?深度学习(以下简称为DL)正是为了解决特征提取的问题,我们不再需要人工设计特征,而是让算法从数据中自动学习特征,将简单的特征组合形成复杂的特征来解决这些问题,所以DL可以说是实现ML的一种技术。

TensorFlow简介

TensorFlow是什么

Tensorflow是一个Google开发的第二代机器学习系统,克服了第一代系统DistBelief仅能开发神经网络算法、难以配置、依赖Google内部硬件等局限性,应用更加广泛,并且提高了灵活性和可移植性,速度和扩展性也有了大幅提高。字面上理解,TensorFlow就是以张量(Tensor)在计算图(Graph)上流动(Flow)的方式的实现和执行机器学习算法的框架。具有以下特点:

  • 灵活性。TensorFlow不是一个严格的“神经网络”库。只要可以将计算表示成数据流图,就可以使用TensorFlow,比如科学计算中的偏微分求解等。(实际上其官网的介绍中对TF的定位就是基于数据流图的科学计算库,而非仅仅是机器学习库)

  • 可移植性。同一份代码几乎不经过修改既可以部署到有任意数量CPU、GPU或TPU(Tensor Processing Unit,Google专门为机器学习开发的处理器)的PC、服务器或移动设备上。

  • 自动求微分。同Theano一样,TensorFlow也支持自动求微分,用户不需要再通过反向传播求解梯度。

  • 多语言支持。TensorFlow官方支持Python、C++、Go和Java接口,用户可以在硬件配置较好的机器中用Python进行实验,在资源较紧张或需要低延迟的环境中用C++进行部署。

  • 性能。虽然TensorFlow最开始发布时仅支持单机,在性能评测上并不出色,但是凭借Google强大的开发实力,TensorFlow性能已经追上了其他框架。

Google为什么开源Tensorflow

Google第一代分布式机器学习框架DistBelief在内部大规模使用后没有选择开源,而第二代TensorFlow于2015年11月在GitHub上开源,并在持续快速开发迭代中。TensorFlow最早由Google Brain的工程师开发,设计初衷是加速机器学习的研究,并快速地将研究原型转化为产品。Google选择开源TensorFlow的原因很简单:第一是希望借助社区的力量,大家一起完善TensorFlow。第二是回馈社区,Google希望让这个优秀的工具得到更多的应用,提高学术界和工业界使用机器学习的效率。

自从2015年11月开源以来,TensorFlow迅速在众多的机器学习框架中脱颖而出,在Github上获得了最多的Star。下图统计了Github上流行的机器学习框架的Star数量:

TensorFlow大事记

  • 2015年11月9日,Google Research 发布了文章:TensorFlow - Google’s latest machine learning system, open sourced for everyone,正式宣布其新一代机器学习系统开源。

  • 2016年4月13日,TensorFlow v0.8发布,提供分布式计算支持。

  • 2016年4月29日,开发AlphaGo的DeepMind宣布从Torch7平台转向TensorFlow。

  • 2016年4月12日,基于TensorFlow的世界最准确的语法解析器SyntaxNet宣布开源。

  • 2016年6月27日,TensorFlow v0.9发布,提高对移动设备的支持。

  • 2016年8月30日,TF-Slim——TensorFlow的高层库发布,用户可以更简单快速地定义模型。

  • 2017年2月15日,TensorFlow v1.0发布,提高了速度和灵活性,并且承诺提供稳定的Python API。

TensorFlow架构

TF的系统构架分为两部分:

  • 前端:提供编程模型,负责构造计算图,提供Python,C++,Java,Go等多种语言支持。

  • 后端:提供运行时环境,负责执行计算图,采用C++实现。

用户在搭建算法时,可以根据个人喜好和实际需求采用合适的前端语言来构建计算图。图搭建完成后,以Session为桥梁连接TF的后端,启动并执行图的计算过程。TF的后端根据当前硬件环境调用Operation的Kernal(Operation在某种硬件设备的特定实现)完成具体的计算。

注:后文对Session,Operation有具体解释

TensorFlow编程模式

符号式编程 vs 命令式编程

和我们一般常用的命令式(Imperative)编程模式不同,TF采用的是符号式(Symbolic)编程。我们先认识一下两种编程模式:

命令式编程是很常见的编程模式,大多数Python或C++程序都采用命令式编程。命令式编程明确输入变量,根据程序逻辑逐步运算。下面是一段命令式编程的Python代码:

import numpy as np

a = np.ones(10)

b = np.ones(10) * 2

c = b * a

d = c + 1

执行完第一步a = np.ones(10)后,程序得到了输入变量a,第二句后得到了b,当执行c = b * a时,程序通过乘法计算而得到了c。

符号式编程则将计算过程抽象为计算图,所有输入节点、运算节点和输出节点均符号化处理。将上述命令式编程代码转换为符号式编程:

A = Variable('A')

B = Variable('B')

C = B * AD = C + Constant(1)

# compiles the function

f = compile(D)

d = f(A=np.ones(10), B=np.ones(10)*2)

当前四步执行后,程序并没有A、B、C、D的值,仅仅是构建了由这四个符号构成的计算图,如下图所示:

大多数符号式编程的程序中都或显式或隐式地包含编译的步骤,将前面定义的计算图打包成可以调用的函数,而实际的计算则发生在编译后。

Theano和TensorFlow属于典型的符号式编程模式,而Torch则是命令式编程模式。在灵活性上,命令式编程模式更优,而在内存和计算上,符号式编程效率更高。

TensorFlow基本概念

要使用TensorFlow,我们必须理解TensorFlow:

  • 使用图(Graph)表示计算流程

  • 在会话(Session)中执行图

  • 使用张量(Tensor)表示数据

  • 使用变量(Variable)维护状态

  • 使用feed和fetch为任意的操作赋值或从中获取数据

TF使用graph表示计算流程。图中的节点称为操作(Operation,以下简称OP)。每个OP接受0到多个Tensor,执行计算,输出0到多个Tensor。图是对计算流程的描述,需要在Session中运行。Session将计算图的OP分配到CPU或GPU等计算单元,并提供相关的计算方法,并且会返回OP的结果。

张量(Tensor)

TF使用Tensor表示所有数据,相当于Numpy中的ndarray,0维的数值、一维的矢量、二维的矩阵到n维数组都是Tensor。相对于Numpy,TensorFlow提供了创建张量函数的方法,以及导数的自动计算。下表对比了Numpy和TensorFlow的基本用法。

变量(Variable)

在训练模型时,Variable被用来存储和更新参数。Variable包含张量储存在内存的缓冲区中,必须显式地进行初始化,在训练后可以写入磁盘。下面代码中的Variable充当了一个简单的计数器角色:

# Create a Variable, that will be initialized to the scalar value 0.

state = tf.Variable(0, name="counter")

# Create an Op to add one to `state`.

one = tf.constant(1)

new_value = tf.add(state, one)

update = tf.assign(state, new_value)

# Variables must be initialized by running an `init` Op after having

# launched the graph. We first have to add the `init` Op to the graph.

init_op = tf.initialize_all_variables()

# Launch the graph and run the ops.

with tf.Session() as sess:

# Run the 'init' op

sess.run(init_op)

# Print the initial value of 'state'

print(sess.run(state))

# Run the op that updates 'state' and print 'state'.

for _ in range(3):

sess.run(update)

print(sess.run(state))

# output:

# 0

# 1

# 2

# 3

上述代码中assign()操作同add()一样,都是在构建计算图而没有执行实际的计算。直到run()函数才会真正执行赋值等计算操作。

一般来说,用户使用一系列Variable来表示一个统计模型,在训练过程中运行图计算来不断更新,训练完成后可以使用这些Variable构成的模型进行预测。

Feed

TensorFlow除了可以使用Variable和Constant引入数据外,还提供了Feed机制实现从外部导入数据。一般Feed总是与占位符placeholder一起使用。

input1 = tf.placeholder(tf.float32)

input2 = tf.placeholder(tf.float32)

output = tf.mul(input1, input2)

with tf.Session() as sess:

print(sess.run([output], feed_dict={input1:[7.], input2:[2.]}))

# output:

# [array([ 14.], dtype=float32)]

Fetch

要获取操作的输出,需要执行会话的run()函数,并且提供需要提取的OP。下面是获取输出的典型例子:

input1 = tf.constant([3.0])

input2 = tf.constant([2.0])

input3 = tf.constant([5.0])

intermed = tf.add(input2, input3)

mul = tf.mul(input1, intermed)

with tf.Session() as sess:

result = sess.run([mul, intermed])

print(result)

# output:

# [array([ 21.], dtype=float32), array([ 7.], dtype=float32)]

图和会话

由于TF采用符号式编程模式,所以TF程序通常可以分为两部分:图的构建和图的执行。

图的构建

构建图的第一步,是创建源OP(source op),源操作不需要任何输入,例如常量(constant),源操作的输出被传递给其它操作做运算。

Python库中,OP构造器的返回值代表被构造出的OP的输出,这些返回值可以传递给其它OP构造器作为输入。

TensorFlow Python库有一个默认图 (default graph),OP构造器可以为其增加节点。这个默认图对许多程序来说已经足够用了。

import tensorflow as tf

# Create a Constant op that produces a 1x2 matrix. The op is

# added as a node to the default graph.

#

# The value returned by the constructor represents the output

# of the Constant op.

matrix1 = tf.constant([[3., 3.]])

# Create another Constant that produces a 2x1 matrix.

matrix2 = tf.constant([[2.],[2.]])

# Create a Matmul op that takes 'matrix1' and 'matrix2' as inputs.

# The returned value, 'product', represents the result of the matrix

# multiplication.

product = tf.matmul(matrix1, matrix2)

上面使用TensorFlow提供的默认图构建了包含三个节点的计算图:两个constant()操作和一个matmul()操作。要实际执行矩阵乘法,必须在Session中运行该计算图。

图的执行

要执行计算图,首先需要创建Session对象,如果不提供参数,Session构造器将运行默认图。

# Launch the default graph.

sess = tf.Session()

# To run the matmul op we call the session 'run()' method, passing 'product'

# which represents the output of the matmul op. This indicates to the call

# that we want to get the output of the matmul op back.

#

# All inputs needed by the op are run automatically by the session. They

# typically are run in parallel.

#

# The call 'run(product)' thus causes the execution of three ops in the

# graph: the two constants and matmul.

#

# The output of the op is returned in 'result' as a numpy `ndarray` object.

result = sess.run(product)

print(result)

# ==> [[ 12.]]

# Close the Session when we're done.

sess.close()

Session结束后,需要关闭以释放资源。用户也可以使用with控制语句自动关闭会话。

with tf.Session() as sess:

result = sess.run([product])

print(result)

TensorFlow简单入门--MNIST字符识别

MNIST是一个简单的计算机视觉数据集,包含共7万个手写数字字符,以灰度图表示:

MNIST同时包含每个手写字符对应的数字,称为标签(label)。上图对应的标签为5,0,4,1。

接下来,我们将使用TensorFlow训练一个字符识别的多分类器,通过字符图片预测对应的数字,这里我们使用最简单的多分类器--Softmax回归。

MNIST数据集

首先读取MNIST数据集:

from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

MNIST数据集被读入mnist对象中,分为三部分:55000行的训练集(mnist.train)、10000行的测试集(mnist.test)和5000行的验证集(mnist.validation)。这样的切分很重要,在机器学习模型设计时必须有一个单独的测试数据集不用于训练而是用来评估这个模型的性能,从而更加容易把设计的模型推广到其他数据集上(泛化)。

每个MNIST数据都包含一个字符图片和对应的label,分别用“x”和“y”表示。每个图片“x”由2828个像素构成,展开得到长度为784的向量。最后,我们得到的训练数据集即形状为[55000, 784]的二维数组以及对应的标签(0-9)。

为了方便实现,这里使用“one-hot vector”,即向量中除一个元素为1,其余均为0。举个例子:对于标签3,对应的“one-hot vector”为[0,0,0,1,0,0,0,0,0,0],所以训练集的标签mnist.train.labels为形状为[55000, 10]的二维数组。

Softmax回归

Softmax回归是二分类器logistic回归的推广,是一种最简单的多分类器。Softmax回归分为两步,首先通过加权求和得到一张给定图片属于特定数字类的证据(evidence),如果这个像素具有很强的证据说明这张图片不属于该类,那么相应的权值为负数,相反如果这个像素拥有有利的证据支持这张图片属于这个类,那么权值是正数。

下面的图片显示了一个模型学习到的图片上每个像素对于特定数字类的权值。红色代表负数权值,蓝色代表正数权值。

我们也需要加入一个额外的偏置量(bias),因为输入往往会带有一些无关的干扰量。因此对于给定的输入图片 x 它代表的是数字 i 的证据可以表示为

其中Wij 为 i 像素对 j字符的权重,bi 为数字类 i 的偏置量,j 代表给定图片 x 的像素索引用于像素求和。然后用softmax函数可以把这些证据转换成概率 y:

这里的softmax可以看成是一个激励(activation)函数或者链接(link)函数,把我们定义的线性函数的输出转换成我们想要的格式,也就是关于10个数字类的概率分布。因此,给定一张图片,它对于每一个数字的吻合度可以被softmax函数转换成为一个概率值。softmax函数可以定义为:

用矩阵来表示:

实现回归模型

TF程序可以分为图的构建和图的执行两部分,而图的构建又可细分为输入图、推断图、训练图和评估图四部分。

使用TF之前,首先导入它:

import tensorflow as tf

  • 输入图

x = tf.placeholder("float", [None, 784])

y_ = tf.placeholder("float", [None, 10])

这里的x和y不是一个特定的值,而是两个占位符(placeholder),我们在TF运行计算时输入这个值。我们希望能够输入任意数量的MNIST图像,每一张图展平成784维的向量。我们用2维的浮点数张量来表示这些图片,这个张量的形状是[None,784]。(这里的None表示此张量的第一个维度可以是任何长度的。)

  • 推断图

W = tf.Variable(tf.zeros([784,10]))

b = tf.Variable(tf.zeros([10]))

y = tf.nn.softmax(tf.matmul(x,W) + b)

对于模型中的权重和偏置量这些参数,我们使用Variable来表示。初始化模型参数,这里我们用全为零的张量来初始化W和b。因为我们要学习W和b的值,它们的初值可以随意设置。注意,W的维度是[784,10],因为我们想要用784维的图片向量乘以它以得到一个10维的证据值向量,每一位对应不同数字类。b的形状是[10],所以我们可以直接把它加到输出上面。

我们用tf.matmul(X,W)表示x乘以W,对应之前等式里面的,这里x是一个2维张量拥有多个输入。然后再加上b,把和输入到tf.nn.softmax函数里面。这样就得到了推断结果y。

  • 训练图

计算图的第三个要素是训练图。为了训练我们的模型,我们首先需要定义一个指标来评估这个模型是好的。其实,在机器学习,我们通常定义指标来表示一个模型是坏的,这个指标称为代价(cost)或损失(loss),然后尽量最小化这个指标。

一个非常常见的代价函数是“交叉熵”(cross-entropy)。交叉熵产生于信息论里面的信息压缩编码技术,但是它后来演变成为从博弈论到机器学习等其他领域里的重要技术手段。它的定义如下:

是我们预测的概率分布,是实际的分布(我们输入的one-hot vector)。比较粗糙的理解是,交叉熵是用来衡量我们的预测用于描述真相的低效性。

实现交叉熵:

cross_entropy = -tf.reduce_sum(y_*tf.log(y))

首先,用tf.log计算y的每个元素的对数。接下来,我们把y_的每一个元素和tf.log(y_)的对应元素相乘。最后,用tf.reduce_sum计算张量的所有元素的总和。(注意,这里的交叉熵不仅仅用来衡量单一的一对预测和真实值,而是所有100幅图片的交叉熵的总和。对于100个数据点的预测表现比单一数据点的表现能更好地描述我们的模型的性能。

现在我们知道我们需要我们的模型做什么啦,用TensorFlow来训练它是非常容易的。因为TensorFlow拥有一张描述你各个计算单元的图,它可以自动地使用反向传播算法(backpropagation algorithm)来有效地确定你的变量是如何影响你想要最小化的那个代价函数的。然后,TensorFlow会用你选择的优化算法来不断地修改变量以降低代价函数。

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

在这里,我们要求TF用梯度下降算法(gradient descent algorithm)以0.5的学习速率最小化交叉熵。梯度下降算法(gradient descent algorithm)是一个简单的学习过程,TF只需将每个变量一点点地往使代价不断降低的方向移动。当然TF也提供了其他许多优化算法:只要简单地调整一行代码就可以使用其他的算法。

TF在这里实际上所做的是,它会在后台给描述你的计算的那张图里面增加一系列新的计算操作单元用于实现反向传播算法和梯度下降算法。然后,它返回给你的只是一个单一的操作,当运行这个操作时,它用梯度下降算法训练你的模型,微调你的变量,不断减少代价。

我们现在可以创建一个Session来运行模型,

sess = tf.InteractiveSession()

首先我们需要初始化所有变量,

tf.global_variables_initializer().run()

然后开始训练模型,这里我们让模型循环训练1000次!

for _ in range(1000):

batch_xs, batch_ys = mnist.train.next_batch(100)

sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

该循环的每个步骤中,我们都会随机抓取训练数据中的100个批处理数据点,然后我们用这些数据点作为参数替换之前的占位符来运行train_step。

使用一小部分的随机数据来进行训练被称为随机训练(stochastic training)- 在这里更确切的说是随机梯度下降训练。在理想情况下,我们希望用我们所有的数据来进行每一步的训练,因为这能给我们更好的训练结果,但显然这需要很大的计算开销。所以,每一次训练我们可以使用不同的数据子集,这样做既可以减少计算开销,又可以最大化地学习到数据集的总体特性。

  • 评估图

最后,我们要评估模型的性能,还需要构建评估图。

首先让我们找出那些预测正确的标签。tf.argmax 是一个非常有用的函数,它能给出某个tensor对象在某一维上的其数据最大值所在的索引值。由于标签向量是由0,1组成,因此最大值1所在的索引位置就是类别标签,比如tf.argmax(y,1)返回的是模型对于任一输入x预测到的标签值,而 tf.argmax(y_,1) 代表正确的标签,我们可以用 tf.equal 来检测我们的预测是否真实标签匹配(索引位置一样表示匹配)。

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

这行代码会给我们一组布尔值。为了确定正确预测项的比例,我们可以把布尔值转换成浮点数,然后取平均值。例如,[True, False, True, True] 会变成 [1,0,1,1] ,取平均值后得到 0.75.

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

最后,我们计算所学习到的模型在测试数据集上面的正确率。

print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

这个最终结果值应该大约是92%。

其他机器学习框架

Caffe

Caffe全称为Convolutional Architecture for Fast Feature Embedding,目前由BVLC(Berkeley Vision and Learning Center)进行维护。其创始人是加州大学伯克利的Ph.D.贾杨清,后来曾在Google Brain工作,开发TensorFlow。

Caffe优点在于使用配置文件方式定义网络,容易上手。训练速度快,而且有大量训练好的经典模型。组件模块化,方便拓展到新的模型上。

Caffe最开始设计是只是针对图像,没有考虑文本、语音或者时间序列的数据,因此对卷积神经网络的支持很好,但是时间序列RNN、LSTM等支持不是很充分。要实现新的神经网络模块(Layer)时,需要用户自己写C++或CUDA代码实现正向和反向算法,对新用户有一定的难度。Caffe没有原生的分布式支持,官方仅支持单机多CPU的训练,不过有些第三方的支持,如雅虎开源的CaffeOnSpark,可借助Spark的分布式框架实现Caffe的大规模分布式训练。

Torch

Torch的定位是LuaJIT上的高效的科学计算库,其历史非常悠久,但真正发扬光大是在Facebook开源了其深度学习的组件之后。Torch与TensorFlow一样,采用了底层C++加脚本语言调用的方式,不过Torch使用的是Lua,其性能非常优秀,常见的代码通过JIT优化可以到C的性能的80%,但是相对Python并不是那么主流,对多数用户有学习成本。另外,Torch与Theano和TensorFlow采用符号编程模式不同,其采用命令式编程模式,所以实现某些复杂操作以及debug时更方便。

Keras

Keras是一个崇尚极简、高度模块化的神经网络库,使用Python实现,可以运行在TensorFlow或Theano上,旨在让用户进行最快速的原型实验。不同于Theano、TensorFlow等支持通用的数值计算,Keras专注于深度学习,它提供了目前为止最方便的API,用户只需要将高级的模块拼在一起,就可以搭建神经网络,大大降低了编程开销、Keras所有模块都是简洁、易懂、完全可配置、可任意插拔的,基本没有使用限制,神经网络、损失函数、优化器、初始化方法、激活函数和正则化等模块都可以自由组合。使用Keras,只需要几行就可以实现一个MLP,十几行就可以实现一个AlexNet。如果Theano和TensorFlow是深度学习领域的Numpy,那么Keras就是这个领域的scikit-learn。Keras最大的问题就是目前无法直接使用多GPU,所以对大规模的数据处理速度没有其他支持多GPU和分布式的框架快。

参考资料

  • 官网

  • TensorFlow Website(最权威、详细的文档)

    (https://www.tensorflow.org)

  • 视频教程

  • TF开发者Sherry Moore的教程

    (https://www.youtube.com/watch?v=Ejec3ID_h0w&t=2117s)

  • 周莫烦的TF教程

    (https://www.youtube.com/watch?v=2FmcHiLCwTU&list=PL2-dafEMk2A7EEME489DsI468AB0wQsMV)

  • Siraj的TF教程

    (https://www.youtube.com/watch?v=Se9ByBnKb0o&list=PLXO45tsB95cJHXaDKpbwr5fC_CCYylw1f)

  • Python Machine Learning(常用机器学习算法讲解与实践 -- Sebastian Raschka)

    (https://www.amazon.com/Python-Machine-Learning-Sebastian-Raschka/dp/1783555130/ref=sr_1_1?ie=UTF8&qid=1491489025&sr=8-1&keywords=python+machine+learning)

  • TensorFlow实战(TensorFlow实现多种机器学习算法 -- 黄文坚,唐源)

    (https://item.jd.com/12125568.html)

  • 文章

  • 深入浅出Tensorflow(一):深度学习及TensorFlow简介

    (http://www.infoq.com/cn/articles/introduction-of-tensorflow-part01)

  • Programming Models for Deep Learning

    (http://mxnet.io/architecture/program_model.html#symbolic-and-imperative-programs)

  • TensorFlow学习笔记1:入门

    (http://www.jeyzhang.com/tensorflow-learning-notes.html)

  • 图解TensorFlow架构与设计

    (https://mp.weixin.qq.com/s?__biz=MzAwNDI4ODcxNA==&mid=2652244394&idx=1&sn=8c66795bc0e0d262f8defd18c07165a3)


End.

运行人员:中国统计网小编(微信号:itongjilove)

微博ID:中国统计网



延展阅读:一文读懂TensorFlow基础

来源:THU数据派


1. 前言

深度学习算法的成功使人工智能的研究和应用取得了突破性进展,并极大地改变了我们的生活。越来越多的开发人员都在学习深度学习方面的开发技术。Google推出的TensorFlow是目前最为流行的开源深度学习框架,在图形分类、音频处理、推荐系统和自然语言处理等场景下都有丰富的应用。尽管功能强大,该框架学习门槛并不高,只要掌握Python安装和使用,并对机器学习和神经网络方面的知识有所了解就可以上手。本文就带你来一趟TensorFlow的启蒙之旅。

2. 初识TensorFlow

2.1. TensorFlow安装说明

我们先来安装TensorFlow。TensorFlow对环境不算挑剔,在Python 2.7和Python3下面均可运行,操作系统Linux、MAC、Windows均可(注意新版本刚出来时可能只支持部分操作系统),只要是64位。安装TensorFlow主要不同之处是TensorFlow安装包分支持GPU和不支持GPU两种版本,名称分别为tensorflow-gpu和tensorflow。实际生产环境最好安装支持GPU的版本,以利于GPU强大的计算能力,不过这需要先安装相应的CUDA ToolKit和CuDNN。相比之下,安装不支持GPU的TensorFlow包容易些,顺利的话执行一句pip install tensorflow就OK。如果读者在安装中遇到问题,可根据错误提示在网上搜索解决办法。

安装后,可在命令行下启动Python或打开Jupyter Notebook,执行下面的语句验证TensorFlow是否安装成功。

>>>import tensorflow as tf

用tf引用TensorFlow包已成为一种约定。在本文的所有示例代码中,均假定已事先执行该语句。

2.2. TensorFlow计算模型

我们先来看在TensorFlow中如何计算c = a + b。这里a = 3,b = 2。

>>>a = tf.constant (3)

>>>b = tf.constant (2)

>>>c = a + b

>>>sess = tf.Session ()

>>>print (sess.run(c))

5

从上面的代码可以看出,比起Python中的一句print (3+2),TensorFlow中实现同样的功能需要更多的步骤。首先得把参数打包,再交给Session对象执行才能输出结果。

现在我们对代码稍作修改,让程序输出更多的调试信息。

>>>a = tf.constant (3)

>>>b = tf.constant (2)

>>>print (a, b)

Tensor("Const:0", shape=(), dtype=int32) Tensor("Const_1:0", shape=(), dtype=int32)

>>>c = a + b

>>>print(c)

Tensor("add:0", shape=(), dtype=int32)

>>>sess = tf.Session ()

>>>sess.run ((a,b))

(3,2)

>>>print(sess.run(c))

5

从上面可以看出,a、b、c都是张量(Tensor)而不是数字。张量的数学含义是多维数组。我们把1维数组称为向量,2维数组称为矩阵。而不管1维、2维、3维、4维,都可以称作张量,甚至标量(数字)也可以看作是0维的张量。在深度学习中,几乎所有数据都可以看作张量,如神经网络的权重、偏置等。一张黑白图片可以用2维张量表示,其中的每个元素表示图片上一个像素的灰度值。一张彩色图片则需要用3维张量表示,其中两个维度为宽和高,另一个维度为颜色通道。TensorFlow的名字中就含有张量(Tensor)这个词。另一个词Flow的意思是“流”,表示通过张量的流动来表达计算。TensorFlow是一个通过图(Graph)的形式来表述计算的编程系统,图中每个节点为一种操作(Operation),包括计算、初始化、赋值等。张量则为操作的输入和输出。如上面的c = a + b为张量的加法操作,等效于c = tf.add (a, b),a和b是加法操作的输入,c是加法操作的输出。

把张量提交给会话对象(Session)执行,就可以得到具体的数值。即在TensorFlow中包含两个阶段,先以计算图的方式定义计算过程,再提交给会话对象,执行计算并返回计算结果。这是由于,TensorFlow的核心不是用Python语言实现的,每一步调用都需要函数库与Python之间的切换,存在很大开销。而且TensorFlow通常在GPU上执行,如果每一步都自动执行的话,则GPU把大量资源浪费在多次接收和返回数据上,远不如一次性接收返回数据高效。我们可以把TensorFlow的计算过程设想为叫外卖。如果我们到馆子里用餐,可以边吃边上菜。如果叫外卖的话,就得先一次性点好菜谱,再让对方把饭菜做好后打包送来,让送餐的多次跑路不太合适。

与sess.run (c)的等效的语句是c.eval (session = sess)。作为对象和参数,张量和会话刚好调了个位置。如果上下文中只用到一个会话,则可用tf.InteractiveSession()创建默认的会话对象,后面执行计算时无需再指定。即:

>>>a = tf.constant (3)

>>>b = tf.constant (2)

>>>c = a + b

>>>sess = tf.InteractiveSession ()

>>>print (c.eval())

5

另外,在先前的代码中,参数3和2被固化在代码中。如果要多次执行加法运算,我们可以用tf.placeholder代替tf.constant,而在执行时再给参数赋值。如下面的代码所示:

>>>a = tf.placeholder(tf.int32)

>>>b = tf.placeholder(tf.int32)

>>>c = a + b

>>> sess = tf.InteractiveSession()

#下面的语句也可写成print (sess.run (c, {a:3, b:2}))

>>>print (c.eval ({a:3, b:2}))

5

>>>print (c.eval ({a:[1,2,3], b:[4,5,6]}))

[5 7 9]

另一种存储参数的方式是使用变量对象(tf.Variable)。与tf.constant函数创建的张量不同,变量对象支持参数的更新,不过这也意味着依赖更多的资源,与会话绑定得更紧。变量对象必须在会话对象中明确地被初始化,通常调用tf.global_variables_initializer函数一次性初始化所有变量。

>>>a = tf.Variable (3)

>>>b = tf.Variable (2)

>>>c = a + b

>>>init = tf.global_variables_initializer()

>>>sess = tf.InteractiveSession()

>>>init.run()

>>>print(c.eval())

5

>>>a.load (7)

>>>b.load (8)

>>>print (c.eval())

15

在深度学习中,变量对象通常用于表示待优化的模型参数如权重、偏置等,其数值在训练过程中自动调整。这在本文后面的例子中可以看到。

3. TensorFlow机器学习入门

3.1. 导入数据

MNIST是一个非常有名的手写体数字识别数据集,常常被用作机器学习的入门样例。TensorFlow的封装让使用MNIST更加方便。现在我们就以MINIST数字识别问题为例探讨如何使用TensorFlow进行机器学习。

MNIST是一个图片集,包含70000张手写数字图片:

它也包含每一张图片对应的标签,告诉我们这个是数字几。比如,上面这四张图片的标签分别是5,0,4,1。

在下面的代码中,input_data.read_data_sets()函数下载数据并解压。

from tensorflow.examples.tutorials.mnist import input_data

# MNIST_data为随意指定的存储数据的临时目录

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

下载下来的数据集被分成3部分:55000张训练数据(minist.train);5000张验证数据(mnist.validation);10000张测试数据(mnist.test)。切分的目的是确保模型设计时有一个单独的测试数据集不用于训练而是用来评估这个模型的性能,从而更加容易把设计的模型推广到其他数据集上。

每一张图片包含个像素点。我们可以用一个数字数组来表示一张图片:

数组展开为长度是的向量,则训练数据集mnist.train.images 是一个形状为 [60000, 784] 的张量。在此张量里的每一个元素,都表示某张图片里的某个像素的灰度,其值介于0和1之间。

MNIST数据集的标签是长度为10的one-hot向量(因为前面加载数据时指定了one_hot为True)。 一个one-hot向量除了某一位的数字是1以外其余各维度数字都是0。比如,标签3将表示成([0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0])。因此, mnist.train.labels 是一个 [55000, 10] 的数字矩阵。

3.2. 设计模型

现在我们通过训练一个叫做Softmax的机器学习模型来预测图片里的数字。回顾一下,分类和回归(数值预测)是最基本的机器学习问题。线性回归是针对回归问题最基本的机器学习模型,其基本思想是为各个影响因素分配合适的权重,预测的结果是各影响因素的加权和。逻辑(Logistic)回归则常用来处理分类问题,它在线性回归的基础上,通过Logistic函数(也称Sigmoid函数)把低于和高于参照值的结果分别转换为接近0和1的数值。不过逻辑回归只能处理二分问题。Softmax回归则是逻辑回归在多分类问题上的推广。整个模型如下图所示:

或者用线性代数公式表示为:

其中,x为输入数据的特征向量,向量的长度为图片的像素(),向量中的每个元素为图片上各点的灰度值,W为的权重矩阵,其中784对应于图片的像素,10对应于0 - 9这10个数字,b为长度为10的向量,向量中的每个元素为0 - 9各个数字的偏置,得到各个数字的权重,最后softmax函数把权重转换为概率分布。通常我们最后只保留概率最高的那个数字,不过有时也关注概率较高的其他数字。

下面是TensorFlow中实现该公式的代码,核心代码为最后一句,其中tf.matmul函数表示Tensor中的矩阵乘法。注意与公式中略有不同的是,这里把x声明为2维的张量,其中第1维为任意长度,这样我们就可以批量输入图片进行处理。另外,为了简单起见,我们用0填充W和b。

x = tf.placeholder (tf.float32, [None, 784])

W = tf.Variable (tf.zeros([784, 10]))

b = tf.Variable (tf.zeros([10]))

y = tf.nn.softmax (tf.matmul (x, W) + b)

除了模型外,我们还需要定义一个指标来指示如何优化模型中的参数。我们通常定义指标来表示一个模型不尽人意的程度,然后尽量最小化这个指标。这个指标称为成本函数。成本函数与模型是密切相关的。回归问题一般用均方误差作成本函数,而对于分类问题,常用的成本函数是交叉熵(cross-entropy),定义为

其中y是我们预测的概率分布,y’是实际的分布。对交叉熵的理解涉及信息论方面的知识,这里我们可以把它看作反映预测不匹配的指标,或者说该指标反映实际情况出乎预料的程度。注意交叉熵是非对称的。在TensorFlow中,交叉熵表示为下面的代码:

cross_entropy = -tf.reduce_sum (y_ * tf.log (y))

因为交叉熵一般会与Softmax回归一起使用,所以TensorFlow对这两个功能进行了统一封装,并提供了tf.nn.softmax_cross_entropy_with_logits函数。可以直接通过下面的代码来实现使用了Softmax回归之后的交叉熵函数。注意与公式中的y不同,代码中的y是Softmax函数调用前的值。最后调用tf.reduce_mean函数取平均值,因为图片是批量传入的,针对每张图片会计算出一个交叉熵。

y = tf.matmul (x, W) + b

cross_entropy = tf.reduce_mean (

tf.nn.softmax_cross_entropy_with_logits (labels = y_, logits = y))

3.3. 设计优化算法

现在我们需要考虑如何调整参数使成本函数最小,这在机器学习中称为优化算法的设计问题。笔者这里对TensorFlow实现优化的过程作一个简要的介绍,要知道优化算法从某种意义上讲比模型更重要。

TensorFlow是一个基于神经网络的深度学习框架。对于Softmax这样的模型,被当作是不含隐藏层的全连接神经网络。通过调整神经网络中的参数对训练数据进行拟合,可以使得模型对未知的样本提供预测的能力,表现为前向传播和反向传播(Backpropagation)的迭代过程。在每次迭代的开始,首先需要选取全部或部分训练数据,通过前向传播算法得到神经网络模型的预测结果。因为训练数据都是有正确答案标注的,所以可以计算出当前神经网络模型的预测答案与正确答案之间的差距。最后,基于预测值和真实值之间的差距,反向传播算法会相应更新神经网络参数的取值,使得在这批数据上神经网络模型的预测结果和真实答案更加接近。如下图所示:

TensorFlow支持多种不同的优化器,读者可以根据具体的应用选择不同的优化算法。比较常用的优化方法有三种:tf.train.GradientDescentOptimizer、tf.train.AdamOptimizer和tf.train.MomentumOptimizer。

train_step = tf.train.GradientDescentOptimizer (0.01).minimize (cross_entropy)

在这里,我们要求TensorFlow用梯度下降算法(Gradient Descent)以0.01的学习速率最小化交叉熵。梯度下降算法是一个简单的学习过程,TensorFlow只需将每个变量一点点地往使成本不断降低的方向移动。语句返回的train_step表示执行优化的操作(Operation),可以提交给会话对象运行。

3.4. 训练模型

现在我们开始训练模型,迭代1000次。注意会话对象执行的不是W、b也不是y,而是train_step。

for i in range(1000):

batch_xs, batch_ys = mnist.train.next_batch(100)

sess.run (train_step, feed_dict = {x: batch_xs, y_: batch_ys})

该循环的每个步骤中,我们都会随机抓取训练数据中的100个批处理数据点,然后我们用这些数据点作为参数替换之前的占位符来运行train_step操作。

使用一小部分的随机数据来进行训练被称为随机训练(stochastic training)- 在这里更确切的说是随机梯度下降训练。在理想情况下,我们希望用我们所有的数据来进行每一步的训练,因为这能给我们更好的训练结果,但显然这需要很大的计算开销。所以,每一次训练我们可以使用不同的数据子集,这样做既可以减少计算开销,又可以最大化地学习到数据集的总体特性。

3.5. 评估模型

到验证我们的模型是否有效的时候了。我们可以基于训练好的W和b,用测试图片计算出y,并取预测的数字与测试图片的实际标签进行对比。在Numpy中有个非常有用的函数argmax,它能给出数组中最大元素所在的索引值。由于标签向量是由0, 1组成,因此最大值1所在的索引位置就是类别标签。对y而言,最大权重的索引位置就是预测的数字,因为softmax函数是单调递增的。下面代码比较各个测试图片的预测与实际是否匹配,并通过均值函数计算正确率。

import numpy as np

output = sess.run (y, feed_dict = {x: mnist.test.images})

print (np.mean (np.argmax(output,1) == np.argmax(mnist.test.labels,1)))

我们也可以让TensorFlow来执行比较,这在很多时候更为方便和高效。TensorFlow中也有类似的argmax函数。

correct_prediction = tf.equal (tf.argmax(y,1), tf.argmax(y_,1))

accuracy = tf.reduce_mean (tf.cast(correct_prediction, "float"))

print (sess.run (accuracy, feed_dict = {x: mnist.test.images, y_: mnist.test.labels}))

这个最终结果值应该大约是91%。完整的代码请参考https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py,有少量修改。

4. TensorFlow深度学习入门

4.1. 卷积神经网络介绍

前面我们使用了单层神经网络。如果增加神经网络的层数,可以进一步提高正确率。不过,增加层数会使需要训练的参数增多,这除了导致计算速度减慢,还很容易引发过拟合问题。所以需要一个更合理的神经网络结构来有效地减少神经网络中参数个数。对于图像识别这类问题,卷积神经网络(CNN)是目前最为有效的结构。

卷积神经网络是一个层级递增的结构,其基本思想是从对像素、边缘的认识开始,再到局部形状,最后才是整体感知。在传统方法中,我们需要在分类前对图像进行预处理,如平滑、去噪、光照归一化等,从中提取角点、梯度等特征,而卷积神经网络把这一过程自动化。当然,神经网络是一个黑盒子,没有前面所提到的这些概念,它所提取的都是抽象意义上的特征,与人类理解的语意特征无法对应。况且经过多层变换,图片早已面目全非。另外卷积神经网络也可以用于图像识别以外的领域。不过为了浅显易懂,下文中仍然使用像素、颜色之类的日常用语。

卷积神经网络中特征识别的基本手段是卷积(Convolution)。我们可以理解为把图片进行特效处理,新图片的每个位置的像素值是原图片对应位置及相邻位置像素值的某种方式的叠加或取反,类似于Photoshop中的滤镜如模糊、锐化、马赛克什么的,TensorFlow中称为过滤器(Filter)。卷积的计算方式是相邻区域内像素的加权求和,用公式表示的话,仍是,不过计算限定在很小的矩形区域内。

由于卷积只针对图片的相邻位置,可保证训练后能够对于局部的输入特征有最强的响应。另外,不论在图像的什么位置,都使用同一组权重,相当于把过滤器当作手电筒在图片上来回扫描,这使图像内容在图片中的位置不影响判断结果。卷积网络的这些特点使它显著减少参数数量的同时,又能够更好的利用图像的结构信息,提取出图像从低级到复杂的特征,甚至可以超过人类的表现。

神经网络需要使用激活函数去除线性化,否则即便增加网络的深度也依旧还是线性映射,起不到多层的效果。与Softmax模型所使用的Sigmoid函数不同,卷积神经网络钟爱激活函数的是ReLU,它有利于反向传播阶段的计算,也能缓解过拟合。ReLU函数很简单,就是忽略小于0的输出,可以理解为像折纸那样对数据进行区分。注意在使用ReLU函数时,比较好的做法是用一个较小的正数来初始化偏置项,以避免神经元节点输出恒为0的问题。下图是Sigmoid和ReLU函数的对比。

除了卷积外,卷积神经网络通常还会用到降采样(downsampling或subsampling)。我们可以理解为把图片适当缩小,由此在一定程度上控制过拟合并减少图像旋转、扭曲对特征提取的影响,因为降采样过程中模糊了方向信息。卷积神经网络正是通过卷积和降采样,成功将数据量庞大的图像识别问题不断降维,最终使其能够被训练。降采样在卷积神经网络中通常被称为池化(Pooling),包括最大池化、平均池化等。其中最常见的是最大池化,它将输入数据分成不重叠的矩形框区域,对于每个矩形框的数值取最大值作为输出。如下图所示。

4.2. 构建LeNet-5网络

对卷积神经网络有了基本了解后,我们现在开始使用这种网络来处理MNIST数字识别问题。这里参照最经典的LeNet-5模型,介绍如何使用TensorFlow进行深度学习。LeNet-5的结构如下图所示。可以看出,LeNet-5中包含两次的卷积和降采样,再经过两次全连接并使用Softmax分类作为输出。

模型第一层是卷积层。输入是原始图片,尺寸为,颜色用灰度表示,因此数据类型为,考虑到批量输入,数据应有4个维度。过滤器尺寸为,计算32个特征,因此权重W为的张量,偏置b为长度32的向量。另外,为确保输出的图片仍为大小,在对图片边缘的像素进行卷积时,我们用0补齐周边。

TensorFlow中,tf.nn.conv2d函数实现卷积层前向传播的算法。这个函数的前两个参数分别表示输入数据x和权重W,均为4个维度的张量,如前所述。权重在初始化时应该加入少量的噪声来打破对称性以及避免0梯度,这里我们用tf.truncated_normal函数生成的随机量填充。函数的随后两个参数定义卷积的方式,包括过滤器在图像上滑动时移动的步长及填充方式。步长用长度为4的数组表示,对应输入数据的4个维度,实际上只需要调整中间两个数字,这里我们设置为[1, 1, 1, 1],表示一个像素一个像素地移动。填充方式有“SAME”或“VALID”两种选择,其中“SAME”表示添加全0填充,“VALID”表示不添加。

下面的代码实现模型第一层:

x = tf.placeholder (tf.float32, [None, 784])

# 这里使用tf.reshape函数校正张量的维度,-1表示自适应

x_image = tf.reshape (x, [-1, 28, 28, 1])

W_conv1 = tf.Variable (tf.truncated_normal ([5, 5, 1, 32], stddev = 0.1))

b_conv1 = tf.Variable (tf.constant (0.1, shape = [32]))

#执行卷积后使用ReLU函数去线性化

h_conv1 = tf.nn.relu (tf.nn.conv2d(

x_image, W_conv1, strides = [1, 1, 1, 1], padding = 'SAME') + b_conv1)

模型第二层为降采样层。采样窗口尺寸为,不重叠,因此步长也是,采用最大池化,采样后图像的尺寸缩小为原来的一半。实现图片最大池化的函数是tf.nn.max_pool。它的参数与tf.nn.conv2d类似,只不过第二个参数设置的不是权重而是采样窗口的大小,用长度为4的数组表示,对应输入数据的4个维度。

h_pool1 = tf.nn.max_pool (h_conv1, ksize = [1, 2, 2, 1],

strides = [1, 2, 2, 1], padding = 'SAME')

模型第三层为卷积层。输入数据尺寸为,有32个特征,过滤器尺寸仍为,需计算64个特征,因此权重W的类型为,偏置b为长度64的向量。

W_conv2 = tf.Variable (tf.truncated_normal ([5, 5, 32, 64], stddev = 0.1))

b_conv2 = tf.Variable (tf.constant(0.1, shape = [64]))

#执行卷积后使用ReLU函数去线性化

h_conv2 = tf.nn.relu (tf.nn.conv2d(

h_pool1, W_conv2, strides = [1, 1, 1, 1], padding = 'SAME') + b_conv2)

模型第四层为降采样层,与第二层类似。图像尺寸再次缩小一半。

h_pool2 = tf.nn.max_pool (h_conv2, ksize = [1, 2, 2, 1],

strides = [1, 2, 2, 1], padding = 'SAME')

模型第五层为全连接层。输入数据尺寸为,有64个特征,输出1024个神经元。由于是全连接,输入数据x和权重W都应为2维的张量。全连接参数较多,这里引入Dropout避免过拟合。Dropout在每次训练时随机禁用部分权重,相当于多个训练实例上取平均结果,同时也减少了各个权重之间的耦合。TensorFlow中实现Dropout的函数为tf.nn.dropout。该函数第二个参数表示每个权重不被禁用的概率。

W_fc1 = tf.Variable (tf.truncated_normal ([7 * 7 * 64, 1024], stddev = 0.1))

b_fc1 = tf.Variable (tf.constant (0.1, shape = [1024]))

#把4维张量转换为2维

h_pool2_flat = tf.reshape (h_pool2, [-1, 7*7*64])

h_fc1 = tf.nn.relu (tf.matmul (h_pool2_flat, W_fc1) + b_fc1)

keep_prob = tf.placeholder (tf.float32)

h_fc1_drop = tf.nn.dropout (h_fc1, keep_prob)

模型最后一层为全连接加上Softmax输出,类似之前介绍的单层模型。

W_fc2 = tf.Variable (tf.truncated_normal ([1024, 10], stddev = 0.1))

b_fc2 = tf.Variable (tf.constant(0.1, shape = [10]))

y_conv = tf.matmul (h_fc1_drop, W_fc2) + b_fc2

cross_entropy = tf.reduce_mean(

tf.nn.softmax_cross_entropy_with_logits (labels = y_, logits = y_conv))

4.3. 训练和评估模型

为了进行训练和评估,我们使用与之前简单的单层Softmax模型几乎相同的一套代码,只是我们会用更加复杂的ADAM优化器来缩短收敛时间,另外在feed_dict中加入额外的参数keep_prob来控制Dropout比例。然后每100次迭代输出一次日志。

train_step = tf.train.AdamOptimizer (1e-4).minimize (cross_entropy)

correct_prediction = tf.equal (tf.argmax (y_conv, 1), tf.argmax (y_, 1))

accuracy = tf.reduce_mean (tf.cast (correct_prediction, tf.float32))

sess = tf.InteractiveSession()

sess.run (tf.global_variables_initializer())

for i in range(20000):

batch_xs, batch_ys = mnist.train.next_batch(50)

if i % 100 == 0:

train_accuracy = accuracy.eval (feed_dict = {

x: batch_xs, y_: batch_ys, keep_prob: 1.0})

print('step %d, training accuracy %g' % (i, train_accuracy))

train_step.run (feed_dict = {x: batch_xs, y_: batch_ys, keep_prob: 0.5})

print ('test accuracy %g' % accuracy.eval (feed_dict = {

x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))

以上代码,在最终测试集上的准确率大概是99.2%。完整的代码请参考https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_deep.py,局部有修改。

5. 总结

在本文中,我们介绍了TensorFlow的基本用法,并以MNIST数据为例,基于Softmax模型和卷积神经网络分别讲解如何使用TensorFlow进行机器学习和深度学习。TensorFlow对深度学习提供了强大的支持,包含丰富的训练模型,还提供了TensorBoard、TensorFlow游乐场、TensorFlow Debugger等可视化和调试等手段方便。限于篇幅,这里不一一介绍,详见TensorFlow的官方文档。深度学习是一名较新的技术,理论和实践中都有不少坑。不过只要多学多上手,相信能让TensorFlow成为您手中的利器。

参考资料:

1. 《TensorFlow:实战Google深度学习框架》 才云科技、郑泽宇、顾思宇著

2. 《面向机器智能的TensorFlow实践》 Sam Abrahams等著,段菲、陈澎译

3. 《你好,TensorFlow》 http://mp.weixin.qq.com/s/0qJmicqIxwS7ChTvIcuJ-g

4. 《TensorFlow白皮书》(译文) http://www.jianshu.com/p/65dc64e4c81f

5. 《卷积神经网络》 http://blog.csdn.net/celerychen2009/article/details/8973218

6. 《卷积神经网络入门学习》 http://blog.csdn.net/hjimce/article/details/51761865

编辑:文婧

作者简介

王小鉴 重庆大学计算机硕士,IT老兵,现于重庆一家公司从事技术研发及团队管理。

对海量数据存储、分布式计算、数据分析、机器学习有浓厚兴趣,重点关注性能优化、自然语言处理等技术。


人工智能赛博物理操作系统

AI-CPS OS

人工智能赛博物理操作系统新一代技术+商业操作系统“AI-CPS OS:云计算+大数据+物联网+区块链+人工智能)分支用来的今天,企业领导者必须了解如何将“技术”全面渗入整个公司、产品等“商业”场景中,利用AI-CPS OS形成数字化+智能化力量,实现行业的重新布局、企业的重新构建和自我的焕然新生。


AI-CPS OS的真正价值并不来自构成技术或功能,而是要以一种传递独特竞争优势的方式将自动化+信息化、智造+产品+服务数据+分析一体化,这种整合方式能够释放新的业务和运营模式。如果不能实现跨功能的更大规模融合,没有颠覆现状的意愿,这些将不可能实现。


领导者无法依靠某种单一战略方法来应对多维度的数字化变革。面对新一代技术+商业操作系统AI-CPS OS颠覆性的数字化+智能化力量,领导者必须在行业、企业与个人这三个层面都保持领先地位:

  1. 重新行业布局:你的世界观要怎样改变才算足够?你必须对行业典范进行怎样的反思?

  2. 重新构建企业:你的企业需要做出什么样的变化?你准备如何重新定义你的公司?

  3. 重新打造自己:你需要成为怎样的人?要重塑自己并在数字化+智能化时代保有领先地位,你必须如何去做?

AI-CPS OS是数字化智能化创新平台,设计思路是将大数据、物联网、区块链和人工智能等无缝整合在云端,可以帮助企业将创新成果融入自身业务体系,实现各个前沿技术在云端的优势协同。AI-CPS OS形成的字化+智能化力量与行业、企业及个人三个层面的交叉,形成了领导力模式,使数字化融入到领导者所在企业与领导方式的核心位置:

  1. 精细种力量能够使人在更加真实、细致的层面观察与感知现实世界和数字化世界正在发生的一切,进而理解和更加精细地进行产品个性化控制、微观业务场景事件和结果控制。

  2. 智能:模型随着时间(数据)的变化而变化,整个系统就具备了智能(自学习)的能力。

  3. 高效:企业需要建立实时或者准实时的数据采集传输、模型预测和响应决策能力,这样智能就从批量性、阶段性的行为变成一个可以实时触达的行为。

  4. 不确定性:数字化变更颠覆和改变了领导者曾经仰仗的思维方式、结构和实践经验,其结果就是形成了复合不确定性这种颠覆性力量。主要的不确定性蕴含于三个领域:技术、文化、制度。

  5. 边界模糊:数字世界与现实世界的不断融合成CPS不仅让人们所知行业的核心产品、经济学定理和可能性都产生了变化,还模糊了不同行业间的界限。这种效应正在向生态系统、企业、客户、产品快速蔓延。

AI-CPS OS形成的数字化+智能化力量通过三个方式激发经济增长:

  1. 创造虚拟劳动力,承担需要适应性和敏捷性的复杂任务,即“智能自动化”,以区别于传统的自动化解决方案;

  2. 对现有劳动力和实物资产进行有利的补充和提升,提高资本效率

  3. 人工智能的普及,将推动多行业的相关创新,开辟崭新的经济增长空间


给决策制定者和商业领袖的建议:

  1. 超越自动化,开启新创新模式:利用具有自主学习和自我控制能力的动态机器智能,为企业创造新商机;

  2. 迎接新一代信息技术,迎接人工智能:无缝整合人类智慧与机器智能,重新

    评估未来的知识和技能类型;

  3. 制定道德规范:切实为人工智能生态系统制定道德准则,并在智能机器的开

    发过程中确定更加明晰的标准和最佳实践;

  4. 重视再分配效应:对人工智能可能带来的冲击做好准备,制定战略帮助面临

    较高失业风险的人群;

  5. 开发数字化+智能化企业所需新能力:员工团队需要积极掌握判断、沟通及想象力和创造力等人类所特有的重要能力。对于中国企业来说,创造兼具包容性和多样性的文化也非常重要。


子曰:“君子和而不同,小人同而不和。”  《论语·子路》云计算、大数据、物联网、区块链和 人工智能,像君子一般融合,一起体现科技就是生产力。


如果说上一次哥伦布地理大发现,拓展的是人类的物理空间。那么这一次地理大发现,拓展的就是人们的数字空间。在数学空间,建立新的商业文明,从而发现新的创富模式,为人类社会带来新的财富空间。云计算,大数据、物联网和区块链,是进入这个数字空间的船,而人工智能就是那船上的帆,哥伦布之帆!


新一代技术+商业的人工智能赛博物理操作系统AI-CPS OS作为新一轮产业变革的核心驱动力,将进一步释放历次科技革命和产业变革积蓄的巨大能量,并创造新的强大引擎。重构生产、分配、交换、消费等经济活动各环节,形成从宏观到微观各领域的智能化新需求,催生新技术、新产品、新产业、新业态、新模式。引发经济结构重大变革,深刻改变人类生产生活方式和思维模式,实现社会生产力的整体跃升。





产业智能官  AI-CPS



用“人工智能赛博物理操作系统新一代技术+商业操作系统“AI-CPS OS:云计算+大数据+物联网+区块链+人工智能)在场景中构建状态感知-实时分析-自主决策-精准执行-学习提升的认知计算和机器智能;实现产业转型升级、DT驱动业务、价值创新创造的产业互联生态链






长按上方二维码关注微信公众号: AI-CPS,更多信息回复:


新技术“云计算”、“大数据”、“物联网”、“区块链”、“人工智能新产业:智能制造”、“智能驾驶”、“智能金融”、“智能城市”、“智能零售新模式:案例分析”、“研究报告”、“商业模式”、“供应链金融”、“财富空间”


点击“阅读原文”,访问AI-CPS OS官网



本文系“产业智能官”(公众号ID:AI-CPS)收集整理,转载请注明出处!



版权声明产业智能官(公众号ID:AI-CPS推荐的文章,除非确实无法确认,我们都会注明作者和来源。部分文章推送时未能与原作者取得联系。若涉及版权问题,烦请原作者联系我们,与您共同协商解决。联系、投稿邮箱:erp_vip@hotmail.com





登录查看更多
0

相关内容

MNIST 数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST). 训练集 (training set) 由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生, 50% 来自人口普查局 (the Census Bureau) 的工作人员. 测试集(test set) 也是同样比例的手写数字数据。
【经典书】精通机器学习特征工程,中文版,178页pdf
专知会员服务
359+阅读 · 2020年2月15日
一网打尽!100+深度学习模型TensorFlow与Pytorch代码实现集合
谷歌机器学习速成课程中文版pdf
专知会员服务
146+阅读 · 2019年12月4日
TensorFlow与PyTorch之争,哪个框架最适合深度学习
Python开发者
5+阅读 · 2019年9月18日
深度学习开发必备开源框架
九章算法
12+阅读 · 2018年5月30日
基于TensorFlow的深度学习实战
七月在线实验室
9+阅读 · 2018年4月25日
【机器学习】基于TensorFlow搭建一套通用机器学习平台
tensorflow系列笔记:流程,概念和代码解析
北京思腾合力科技有限公司
30+阅读 · 2017年11月11日
独家 | 一文读懂TensorFlow(附代码、学习资料)
数据派THU
3+阅读 · 2017年10月12日
Arxiv
5+阅读 · 2018年5月21日
Arxiv
11+阅读 · 2018年3月23日
Arxiv
3+阅读 · 2018年2月12日
Arxiv
7+阅读 · 2018年1月31日
Arxiv
5+阅读 · 2016年12月29日
VIP会员
相关资讯
TensorFlow与PyTorch之争,哪个框架最适合深度学习
Python开发者
5+阅读 · 2019年9月18日
深度学习开发必备开源框架
九章算法
12+阅读 · 2018年5月30日
基于TensorFlow的深度学习实战
七月在线实验室
9+阅读 · 2018年4月25日
【机器学习】基于TensorFlow搭建一套通用机器学习平台
tensorflow系列笔记:流程,概念和代码解析
北京思腾合力科技有限公司
30+阅读 · 2017年11月11日
独家 | 一文读懂TensorFlow(附代码、学习资料)
数据派THU
3+阅读 · 2017年10月12日
相关论文
Top
微信扫码咨询专知VIP会员