上一篇《零基础入门机器学习-tensorflow(二)》介绍了Python的基本使用,现在就用Python来实际操作学习一下tensorflow吧。
什么是tensorflow?
TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。其用途不仅限于机器学习,只是这种结构非常适合用于机器学习,所以我们现在说到机器学习,大概第一个就会提到tensorflow。
第一个tensorflow程序 — Hello world!
先看下代码:
# 引入tensorflow库
import tensorflow as tf
# 创建一个操作(常量)
a = tf.constant('Hello world!')
# 启动会话(Session)
sess = tf.Session()
# 运行Graph
print(sess.run(a))
# 关闭会话
sess.close()
代码头部先引入tensorflow库,然后创建了一个常量a,稍后我会介绍在tensorflow中创建常量或变量的方法。
与传统编程方式不同的是,在tensorflow中真正运行代码的部分放置在会话(Session)中,虽然在会话前定义了常量a,但是并没有真正去运行,所以需要在Session中显式的通过Session.run去运行一下,比如上述代码的print(sess.run(a))。会话结束后使用Session.close()关闭。以上是一个完整的tensorflow程序,再复杂的tensorflow程序结构也是如此。
1. 常量定义
# 引入tensorflow库
import tensorflow as tf
# 创建常量
a = tf.constant("这是字符串")
b = tf.constant(4, dtype=tf.int32)
c = tf.constant(0.12, dtype=tf.float32)
d = tf.constant([1, 2, 3, 4], dtype=tf.int32)
with tf.Session() as sess:
print(sess.run(a))
print(sess.run(b))
print(sess.run(c))
print(sess.run(d))
上面的例子中,创建了4个常量,第一个常量a是字符串,在定义时没有定义类型,系统会自动分配为字符串类型;第2、3个常量分别是整型和浮点型,在tensorflow中使用dtype定义类型时最好统一使用tensorflow的数据类型;第4种常量是一个一维数组,也称为张量。
在这个例子中,还看到了使用会话的另一种方法,使用效果是完全一样的。
2. 变量定义
# 引入tensorflow库
import tensorflow as tf
# 创建变量
a = tf.Variable("这是一个变量")
b = tf.Variable(6, tf.int32)
# 初始化变量
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
print(sess.run(a))
print(sess.run(b))
创建变量的方法和常量类似,区别在于,使用变量前需要初始化,上例中的init即初始化过程。
3. placeholder
# 引入tensorflow库
import tensorflow as tf
# 创建placeholer
a=tf.placeholder(tf.float32)
b=tf.placeholder(tf.float32)
c=tf.add(a,b)
with tf.Session() as sess:
print(sess.run(c, feed_dict={a:10, b:5}))
这个例子计算a+b的结果,其中a和b是2个placeholder,在定义时仅指定了数据类型,并没有赋值,placeholder在计算时才会赋值,未计算前只是占位。
feed_dict={a:10, b:5} 是为placeholder赋值的方法,因为c是a+b的结果,为了打印c,需要先为a和b赋值,这种使用方法在tensorflow中非常常见。
图与会话
这是一张简化的数据流图,可以看到,其中蓝色圆点是数据,好比上例中的a和b,蓝色带箭头的线是数据流动的方向,绿色部分是运算处理,所有这些数据、流和运算模块组成了一张类似流程图的图形,对应上例,就是在会话前的所有定义工作,在定义过程中,所有数据均不参与运算,仅仅是把图画好,为后续会话提供计算素材。
现在来看会话就比较好理解了,会话就是让图运行起来,以得到最后的结果。下面是一张真实的tensorflow数据流图:
什么是tensor?
张量(tensor)是所有深度学习框架中最核心的组件,因为tensorflow中几乎所有的所有运算和优化算法都是基于张量进行的。
1. 张量的阶
在TensorFlow中,张量的维数来被描述为阶,但是张量的阶和矩阵的阶并不是同一个概念.张量的阶(有时是关于如顺序或度数或者是n维)是张量维数的一个数量描述。
经常用到的矩阵就是一种2阶张量,也是tensorflow中运用最多的一种张量,下面就是一个2阶张量的定义:
M = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
2. 张量的形状
张量可以用我们所说的形状来描述:用列表(或元祖)来描述我们的张量的每个维度的大小,例如:
- 一个 n 维度的张量可以表示为:(D_0, D_1, D_2, …, D_n-1)
- 一个 * W x H * 大小的张量(一般我们成为矩阵):(W, H)
- 一个尺度是 W 的张量(一般我们称之为向量):(W, )
- 一个简单的标量(或者与之等价的):()或者(1, )
# 引入tensorflow库
import tensorflow as tf
# 创建张量
my_tensor = tf.constant(0., shape=[2,3,5])
with tf.Session() as sess:
print(sess.run(my_tensor))
这个例子中定义了一个3阶张量,3个维度包含的元素分别是2、3、5,最后打印出来如下:
[[[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
[[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]]