在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中的函数类似,但是这些函数直接作用对象是张量,图中的每个结点也仅仅做一件明确的事情。