四时宝库

程序员的知识宝库

原创教程|TensorFlow入门指导(二)

在windows10上快速安装tensorflow

TensorFlow如何工作?

TensorFlow能够在不同设备上(如CPU和GPU)工作。TensorFlow将计算(computations)定义为图(Graphs),图形是由各种操作(ops)组成。所以,当我们要运行TensorFlow时,首先定义图中的一系列操作。

为了启动这些操作以计算,我们必须先在图中打开会话(session)。会话将这些操作转换和传递给要执行它们的设备的CPU或GPU。

例如,下图表示TensorFlow中的一个图。W,x和b都是定义在该图边上的张量(tensors)MatMul是对张量W和x的具体操作,然后调用Add,并将b与先前得到结果相加。每一个操作得到的结果张量都可以继续传递给下一个操作,直到你得到你想要的结果为止。

TensorFlow的图


导入TensorFlow

为了使用TensorFlow,我们需要先导入TensorFlow模块,并给它取名为“tf”,所以当我们调用此模块中的函数使使用tf.module-name即可:

import tensorflow as tf


建立图

正如之前所说,TensorFlow以图模型计算。让我们先建立我们第一个图。我们使用源操作建立我们的第一个图,这不需要任何输入信息。这些源操作(source ops)将它们的信息传递给执行计算的其它操作。要创建两个输出数字的源操作我们将定义两个常数。

a = tf.constant([2])

b = tf.constant([3])

然后,我们对这些变量(常量)进行操作,tf.add()函数将两个变量相加(通常你看到的加法运算时c=a+b)

c = tf.add(a,b) #c = a + b 也是定义两个数和的一种方法


启动并初始化会话,运行我们的代码。我们先定义会话:

session = tf.Session()

让我们运行会话,得c的值:

result = session.run(c)

print(result)

最后关闭会话,释放资源:

session.close()

为了避免每次都关闭会话,我们可以将其定义在with块(block)中,当每次运行结束后会话将自动关闭:


什么是Tensor?

在TensorFlow中,所有数据在计算图中的操作之间传递,并且都有Tensors的形式传递,因此有了TensorFlow这个名称。“tensor”一词来源于新拉丁语“hat which stretches”。tensor是一个数学对象,早期用于材料的拉伸变形研究中,现在tensor可用于表示多维数组。

那么什么是多维数组呢?

让我们回到物理学来理解维度的概念:

维度

零维可以视为点,单个对象或单个项目;一维可以看作一条线,一个一维数组可以看作是沿着这条线的数字排列,或者沿着这条线的点排列;二维可以看作一个表面;三维可以看作是体积;四维可以被看作是超空间或时空,或随时间变化的体积,等等..


总结:


使用TensorFlow定义多维数组

现在使用TensorFlow定义如下数组:

输出结果如下:


现在,你应该已经理解了这些数据结构,我鼓励你自己使用先前的一些函数去测试、理解它们是如何工作的。举个例子:


为什么选择Tensors?

Tensor这种数据结构对于我们处理图片时很有帮助,这是由图像中的信息被如何编码的本质所决定的。考虑一张图片,很容易理解它有长度和宽度,所以用二维结构(矩阵)来表示它的信息是有道理的。但是,图片不仅仅具有长度和宽度,还有颜色,所以我们必须增加颜色的信息,我们就还需要另一个维度,这样的tensor才是特别有帮助的。

将图片在不同的颜色通道中进行编码。给定点处的图片数据表示在每个颜色通道中的颜色强度,最常见的是采用RGB方式,RGB意味着3种颜色通道,即是红色、蓝色和绿色。图片中包含的信息是每个颜色通道中的强度,如下所示:

因此,每个具有长度和宽度的点的红色通道的强度可以表示成一个矩阵,这对于蓝色和绿色通道也是一样,因此最终我们得到了3个矩阵,将这3个矩阵组合在一起就形成了张量。


变量

在TensorFlow中怎样处理变量?为了定义变量,我们使用tf.variable()函数。为了能够在计算图中使用变量,有必要在运行会话前初始化它们。初始化命令是tf.initialize_all_variables()。当要更新变量的值时,只需运行一次赋值操作将值赋给变量:

state = tf.Variable(0)

让我们创建一个简单的计算器,每次增加一个单位

one = tf.constant(1)

new_value = tf.add(state, one)

update = tf.assign(state, new_value)

变量必须在启动图形后通过初始化操作来初始化。 我们首先必须向图中添加初始化操作:

init_op = tf.initialize_all_variables()

然后我们启动会话来运行图形,首先初始化变量,然后打印state变量的初始值,然后再运行更新的state变量并输出每次更新后的结果:

输出结果:

1

2

3

4


占位符(Placeholders)

现在我们知道如何操纵TensorFlow中的变量,但是在TensorFlow模型之外怎么提供数据呢?如果要将数据从模型外部馈送到TensorFlow模型,则需要使用占位符。

那么占位符是什么呢?

占位符在模型中可以被视为“holes”,您可以将数据通过“holes”传递给模型,使用tf.placeholder(datatype)来创建,其中datatyp是e指定的数据类型(整数,浮点数,字符串,布尔值)及其精度(8,16,32,64)位。

使用python的语法, 每个数据类型被定义为:

Python语法中的TensorFlow的数据类型


所以我们使用如下命令创建一个占位符:

a=tf.placeholder(tf.float32)

简单的乘法运算:

b=a*2

现在我们需要定义和运行会话,但是由于我们在模型中创建了一个“hole”来传递数据,所以当我们初始化会话时,我们必须使用数据来传递一个参数,否则会得到一个错误。为了将数据传递给模型,我们需要在会话中使用一个额外的参数feed_dict,其中我们应该传递一个字典,字典中是与每个占位符名称相对应的数据,如下所示:

输出结果:

7.0

由于TensorFlow中的数据是以多维数组的形式传递,我们可以向占位符传递任何类型的张量,以获得简单的乘法运算的答案:

输出结果:


操作

图上的结点(nodes)表示数学意义上的操作。这些操作可以是任何函数,如add,subtract,或者激活函数。tf.matmul,tf.add,tf.nn.sigmoid(是TensorFlow中的激活函数)是TensorFlow中的一些操作。 这与python中的函数类似,但是这些函数直接作用对象是张量,图中的每个结点也仅仅做一件明确的事情。



发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接