TensorFlow Ops

一般流程:

TFboy基操:

  • 定义图
  • 创建writer,两种方式
    • tf.get_default_graph()
    • sess.graph
  • 创建session执行图
  • 关闭writer
  • TensorBoard可视化
1
2
3
4
5
6
7
8
9
10
11
12
import tensorflow as tf

a = tf.constant(2, name='a')
b = tf.constant(3, name='b')
x = tf.add(a, b, name='add')
# 第一种
writer = tf.summary.FileWriter('./graphs/low', tf.get_default_graph())
with tf.Session() as sess:
# 第二种
# writer = tf.summary.FileWriter('./graphs', sess.graph)
print(sess.run(x))
writer.close() # close the writer when you’re done using it

writer会将图(包含的各种ops)以日志文件的形式写入指定目录,tensorboard可以将这些文件可视化出来

上面的程序每跑一次就会产生一个日志文件,不用的日志及时删除

1
2
$ tensorboard --logdir='./graphs/low' --port=6006
#注意路径不要搞错

没记住的

1
2
3
4
5
6
7
tf.fill([2,3],8) ===> [[8,8,8],[8,8,8]]
tf.lin_space(10.0,13.0,4,name=None) ===>[10.0 11.0 12.0 13.0]
#各种分布
tf.random_normal
...
#add multiple tensors
tf.add_n([a,b,b]) ====> a+b+b

变量

变量定义

训练中需要更新的参数定义为变量

常量存储在图中,变量则可能在parameter server上

常量占了很多存储时,加载图会很慢

1
2
3
4
5
6
7
8
9
# old way
tf.Variable(<initial-value>,name=<optional-name>)
# now
tf.get_variable(...)
# 当initializer时tf.constant时,不需要参数shape
s = tf.get_variable("scalar", initializer=tf.constant(2))
m = tf.get_variable("matrix", initializer=tf.constant([[0, 1], [2, 3]]))
W = tf.get_variable("big_matrix", shape=(784, 10), initializer=tf.zeros_initializer())

变量初始化
1
2
3
4
5
6
7
8
#一次性初始化所有变量
sess.run(tf.global_variables_initializer())
#初始化部分变量
sess.run(tf.variables_initializer([a, b]))
#单独初始化
sess.run(W.initializer)
#从文件加载
Todo...
变量的值
1
2
3
# 两种方式
print(sess.run(W))
print(W.eval())
变量赋值
1
2
3
4
5
6
7
# 赋值会完成初始化的工作
W.assign(100)
# 自增自减不会初始化变量
W.assign_add(10)
W.assing_sub(2)
# 变量依赖,使用initialized_value()保证用W的值来初始化V
V = tf.Variable(W.initialized_value()*2)

控制依赖

1
2
3
4
5
6
# g has 5 ops: a,b,c,d,e
# 还没用到过
with g.control_dependencies([a,b,c]):
# d,e only run after a,b,c have executed
d = ...
e = ...

数据导入

  1. old way:placeholders and feed_dict

    例如,对于f(x,y) = 2x + y,x y 就是真实值的占位符

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #shape=None 意味着接收任意shape的张量
    tf.placeholder(dtype,shape=None,name=None)
    #any tensors that are feedable can be fed
    tf.Graph.is_feedable(tensor)
    #feed_dict可以用来测试模型,
    #直接传入某些值免去了大量的计算
    a = tf.add(2, 5)
    b = tf.multiply(a, 3)
    with tf.Session() as sess:
    print(sess.run(b)) # >> 21
    # compute the value of b given the value of a is 15
    print(sess.run(b, feed_dict={a: 15})) # >> 45
  2. new way: tf.data

    [ ] todo…

lazy loading

需要计算op的时候才创建

因为训练绝大数情况都要计算多次,所以lazy loading会产生大量的冗余节点

解决办法:

  1. 尽可能的将ops的定义和计算分开(不要在计算的时候创建op
  2. 当你将相关ops组合在一起(比如,1中的步骤在一个类里面)可以使用python的@property机制确保某些功能只执行一次(!!!有待研究)

相关博客http://danijar.com/structuring-your-tensorflow-models/