好消息是终于把tf的环境搭好啦,那就按照官网的教程一步一步来吧,先来理解一下tensorflow。
Tensorflow是一个编程系统,它用图(graph)的方式来表示计算任务,并且在 会话(session)的上下文(context)中执行图,用tensor(张量)来表示数据,通过变量(variable)来维护运算状态,使用feed或fetch来为操作数(arbitrary operation)赋值或者获取数据。图的节点称为op(也就是operation),每个op都可以接受tensor来执行计算。
先用tf做一个矩阵乘练练手,看看这session到底是啥。在hello world之前先touch world感受一下它的魅力。举个例子就做两个3*3的矩阵互乘吧:
import tensorflor as tf
#这里创建了两个常矩阵mat1和mat2,这里注意一下,tensorflow创建的是tensor(张量)而不是matrix(矩阵),
#所以这里如果创建矩阵,那么就是二阶张量,所以有两层中括号[[1,2,3],[2,3,4],[3,4,5]],我的记忆方法是
#创建几阶张量就有几层中括号
mat1 = tf.constant([[1,2,3],[3,4,5],[5,6,7]]) #这个constant也是tf的一个op
mat2 = tf.constant([[9,8,7],[7,6,5],[5,4,3]])
#这个是tf的矩阵乘法op,将前面的mat1和mat2作为输入,并且返回为cal,但是cal只是代表了矩阵乘法op的输出
cal = tf.matmul(mat1, mat2)
#创建一个会话(session),并且启动默认的图
sess=tf.Session()
#这里调用sess的run()方法是表明要取出cal的结果,然后print出来,这里传递给run的tensor不一定是一个,
#若传入多个tensor,那么也会取出多个tensor
result=sess.run(cal)
print(result)
#关闭会话
sess.close()
输出结果是
[[ 38 32 26]
[ 80 68 56]
[122 104 86]]
一个跟matlab一样方便的计算方式,当然tensorflow只是拿来做矩阵乘法啥的就真是大材小用,不如用numpy计算了。
不过看上面的代码,最后还得显式调用close(),麻烦死啦,可以用with代码块自动完成加载和关闭
with tf.Session() as sess:
result=sess..run(cal)
print(result)
如果需要指定在哪个设备上使用(如CPU或者GPU),需要明确地告诉tf在哪个设备上执行,可以修改成下面的代码。当然一般情况下tensorflow会自动选择,如果检测到了GPU,那它会尽可能用它找到的第一个GPU来工作。
with tf.Session() as sess:
with tf.device("/gpu:0")
:
......
这里的设备用字符串进行标识,如"/cpu:0"(机器的cpu),"/gpu:0"(机器的第一个gpu),"/gpu:1"(机器的第二个gpu)等等。
- 变量
变量是每个编程语言必不可少的组成部分,tensorflow也是,用op操作来维护变量。
import .........
..............
#前面导入包的部分省略
#tf.Variable()返回了一个tf的变量,它包含一些Rewriteconfig,也就是可以重写的属性,例如name
#下面这行返回了一个名为hello,初始值为0的变量
cur = tf.Variable(0, name="hello")
one = tf.Constant(1)
new = tf.add(cur, one)
update = tf.assign(cur, new) #这是tf的赋值op,是图的一部分,在会话中调用run()之前,它也不会进行真正的赋值
init = tf.initialize_all_variables()
#启动图并运行op进行计算
with tf.Session() as sess:
sess.run(init)
print(sess.run(cur))
for i in range(3):
sess.run(update)
print(sess.run(cur))
#得到了输出为
# 0
# 1
# 2
# 3
- placeholder
这是用于tensorflow的feed机制,可以对图中任意op的任意tensor进行feed(打补丁或者注入),最常见的feed操作是作为run()的参数,当将某些操作指定为feed操作时,通常会用placeholder作为占位符来做标记
input1 = tf.placeholder(tf.types.float32)
input2 = tf.placeholder(tf.types.float32)
output = tf.mul(input1, input2)
with tf.Session() as sess:
print(sess.run([output], feed_dict={input1:[7.], input2:[2.]})
#输出为
# [array([ 14. ], dtype=float32)]