原文链接: https://medium.com/@camrongodbout/tensorflow-in-a-nutshell-part-one-basics-3f4403709c9d#.31jv5ekoy
学习世界上最流行的深度学习框架的最快最简单的教程
(其实这个系列写的差强人意,但是的确是学习tensflow精简的教程,比较适合新手入门,高手请绕行--------译者注)
tensorflow是google公司推出的深度学习框架。深度学习是一类采用多层神经网络的机器学习算法。深度学习的思想最早在1943年由神经物理学家Warren McCulloch和数学家Walter Pitts提出,他们在一篇文章里面讨论了神经元的工作原理以及如何采用数字电路模拟一个简单的神经网络。
从那时候起,很多工作逐步发展起来。然而, 伴随这些高度精确的数学模型的是复杂的计算量。近年来,随着GPU和CPU处理速度的提升,深度学习变得流行起来。
tensorflow的设计,受到了机器处理速度限制的影响。这个工具在2015年11月开源,目前能够在包括手机在内的各种计算机上运行。它可以用来编写各种训练模型,也是此时此刻最流行的深度学习框架。
计算图的基础知识
在tensorflow里面,任何事情都是构建在计算图的基础上的。如果你之前用过theano,这部分内容会看起来很熟悉。我们可以把计算图当作网络的节点,其中,每个节点都表示某种操作,就像运行某个函数一样,比如简单的加减,或者复杂的多变量运算。
每个运算可以返回一个值,或者其他的张量,这些张量可以用在后续图中。下面是一些简单的例子。
1 import tensorflow as tf 2 3 4 tf.add(1, 2) 5 # 3 6 7 tf.sub(2, 1) 8 # 1 9 10 tf.mul(2, 2) 11 # 4 12 13 tf.div(2, 2) 14 # 1 15 16 tf.mod(4, 5) 17 # 4 18 19 tf.pow(3, 2) 20 # 9 21 22 # x < y 23 tf.less(1, 2) 24 # True 25 26 # x <= y 27 tf.less_equal(1, 1) 28 # True 29 30 tf.greater(1, 2) 31 # False 32 33 tf.greater_equal(1, 2) 34 # False 35 36 tf.logical_and(True, False) 37 # False 38 39 tf.logical_or(True, False) 40 # True 41 42 tf.logical_xor(True, False) 43 # True
每个操作都能处理常量,矩阵,数组,或者多维矩阵。多维矩阵也就是一个张量,而二维张量就是一个m * m的矩阵。
1 import tensorflow as tf 2 3 # create a constant 2X2 matrix 4 tensor_1 = tf.constant([[1., 2.], [3.,4]]) 5 6 tensor_2 = tf.constant([[5.,6.],[7.,8.]]) 7 8 # create a matrix multiplication operation 9 output_tensor = tf.matmul(tensor_1, tensor_2) 10 11 # have to run the graph using a session 12 sess = tf.Session() 13 14 result = sess.run(output_tensor) 15 print(result) 16 17 sess.close()
上述代码创建了两个常数张量,并把它们的成绩输出来。这个简单的例子展示了如何创建一个图并且执行它。所有需要的输入都自动运行,而且它们还可以并行的执行。执行过程涉及到图中的三个操作,创建两个常量,和矩阵的乘法。
图
在tensorflow中,我们创建的变量和操作会自动的加到图中。在引入tensorflow的时候,系统会自动的构建一个缺省的图。创建一个图,而不采用默认的图,在一个文件构建多个独立模型的时候,是非常有用的。
1 new_graph = tf.Graph() 2 with new_graph.as_default(): 3 new_g_const = tf.constant([1., 2.])
所有在with new_graph.as_default()之外的变量和操作会加到系统默认的图上,下面的代码可以得到一个默认图的句柄。
1 default_g = tf.get_default_graph()
大部分情况下,这是得到系统默认图最好的方法。
运行周期
tensorflow中有两种运行周期。
tf.Session()
它封装了操作和张量执行的环境。运行周期可以有它们自己的变量,队列。所以,运行周期结束的时候,需要调用close()函数结束掉。运行周期有三个可选的参数,分别为:
1. target:要连接的执行引擎
2. graph:需要启动的图
3.config:一些配置
tf.InteractiveSession()
它和前面的tf.session()非常类似,只不过这个执行周期是为IPython和 Jupyter Notebooks设计的,它可以允许你添加一些东西,并通过调用Tensor.eval()以及Operation.run()来执行,而不需要每次执行session.run()来执行。
1 sess = tf.InteractiveSession() 2 a = tf.constant(1) 3 b = tf.constant(2) 4 c = a + b 5 # instead of sess.run(c) 6 c.eval()
InteractiveSession 允许你不用显式的传递一个session对象。
变量
在tensorflow中,变量是由运行周期Session管理的。它们存在于session之间,这是非常有用的,因为张量和操作这些对象是不变的。变量的创建过程如下:
1 tensorflow_var = tf.Variable(1, name="my_variable")
大多数时候,你希望创建各种0,1或者随机张量。
- tf.zeros() — 创建全零矩阵
- tf.ones() — 创建全1矩阵
- tf.random_normal() — 两个数之间的随机数矩阵
- tf.random_uniform() — 随机数矩阵
- tf.truncated_normal() — 和前面类似,但是不包括大于随机方差的数
这些函数可以定义生成的矩阵的尺寸,比如
1 # 4x4x4 matrix normally distribued mean 0 std 1 2 normal = tf.truncated_normal([4, 4, 4], mean=0.0, stddev=1.0)
为了把变量设置成这些矩阵,我们可以
1 normal_var = tf.Variable(tf.truncated_normal([4,4,4] , mean=0.0, stddev=1.0)
为了初始化这些变量,需要在session里面,执行初始化操作,这和多个session运行变量是一样的。
init = tf.initialize_all_variables() sess = tf.Session() sess.run(init)
如果想要完全改变变量的值,你可以调用variable.assign()函数,这个函数也需要在一个session里面执行
1 initial_var = tf.Variable(1) 2 changed_var = initial_var.assign(initial_var + initial_var) 3 init = tf.initialize_all_variables() 4 sess = tf.Session() 5 sess.run(init) 6 sess.run(changed_var) 7 # 2 8 sess.run(changed_var) 9 # 4 10 sess.run(changed_var) 11 # 8
有时候,你需要对变量添加一些东西,你需要执行variable.assign_add()函数,该函数输入一个数为参数,并把该数添加到变量上。函数variable.assign_sub()类似。
1 counter = tf.Variable(0) 2 sess.run(counter.assign_add(1)) 3 # 1 4 sess.run(counter.assign_sub(1)) 5 # -1
作用域
为了控制模型的复杂度并尽可能简单的把模型划分成更小的片段,tensorflow引入了作用域。作用域是个非常见的概念,
1 with tf.name_scope("Scope1"): 2 with tf.name_scope("Scope_nested"): 3 nested_var = tf.mul(5, 5)
可能这里还不能看到作用域的作用,但是在第二部分学习TensorBoard的时候,我们就会看到它的用途。
小结
这里展示了很多tensorflow的重要组成部分。这些独立的部分组合在一起就可以构建复杂的模型。