Tensorflow的初次见面

Tensorflow入门笔记

安装我就省略了,网上有很多教程,没必要自己在写一次。如果有人需要,我也可以写一份。少废话,直接上官方链接

Tensorflow主页
以下内容参考官方文档
Develop->PROGRAMMER’S GUIDE->Variables: Creation, Initialization, Saving, and Loading

Tensorflow的计算图

引用Tensorflow 实战Google深度学习框架的话,Tensorflow 包含两个概念:tensor 和 flow,tensor(张量)表明其数据结构,flow表明其计算模型,也表达了张量之间通过计算相互转化的过程。

TensorFlow 是一个编程系统, 使用图来表示计算任务. 图中的节点被称之为 op (operation 的缩写). 一个 op获得 0 个或多个 Tensor , 执行计算, 产生 0 个或多个 Tensor .

如图,这个相加的op就是节点,const3和const4是Tensor

add

变量: 声明,初始化,保存,读取

文章引用的两个类

  • The tf.Variable class.
  • The tf.train.Saver class.

    声明

    变量声明也是一种计算,变量只是一种特殊的tensor(张量)
    # 声明两个变量
    weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
                        name="weights")
    biases = tf.Variable(tf.zeros([200]), name="biases")
    

Tensorflow还支持在不同运算设备的运行不同的计算图
如果没有指明计算图,则使用Tensorflow默认的计算图,也就是tf

# 放在CPU上的变量
with tf.device("/cpu:0"):
  v = tf.Variable(...)

# 放在GPU上的变量
with tf.device("/gpu:0"):
  v = tf.Variable(...)

# 还可以放在某个任务中.
with tf.device("/job:ps/task:7"):
  v = tf.Variable(...)  

可以在参数中添加tf.train.replica_device_setter=True,当在一个设备运行失败时,可以自动切换到兼容的其他设备,可以踩少很多坑。

初始化

在运行之前一定要将变量初始化,最简单的方法就是将所有变量初始化。Tensorflow也提供了相关方法: tf.initialize_all_variables(),文档中是tf.global_variables_initializer(),从名字看出是初始化全部的全局变量,而使用tf.initialize_all_variables()初始化所有变量。

# Create two variables.
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
                      name="weights")
biases = tf.Variable(tf.zeros([200]), name="biases")
...
# 添加一个初始化操作.
init_op = tf.global_variables_initializer()

# Later, when launching the model
with tf.Session() as sess:
  # 运行初始化操作.
  sess.run(init_op)
  ...
  # Use the model
  ...

使用以上方法的另外好处是自动处理变量间的依赖关系,自己手动初始化的话要注意初始化的先后。如:

# Create a variable with a random value.
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
                      name="weights")
# Create another variable with the same value as 'weights'.
w2 = tf.Variable(weights.initialized_value(), name="w2")
# Create another variable with twice the value of 'weights'
w_twice = tf.Variable(weights.initialized_value() * 2.0, name="w_twice")

变量w2 和 w_twice依赖于weight。

保存 和 读取

保存和读取可以使用tf.train.Saver 这个对象
可以将训练完的变量保存,它可以保存或者读取一个计算图,或者某个计算图中的某个变量的list。saver对象提供了运行这些操作的方法,指定一个路径供checkpoint file读写。

特别的,如果恢复一个没有计算图的checkpoint,首先要从meta graph文件中导入计算图,由tf.train.import_meta_graph完成。

Checkpoint Files

变量保存在二进制文件中,包含着一个变量名和tensor值的map。

当你声明一个Saver对象,你可以选择性地指定一个或多个在checkpoint中的变量的名字,默认是使用tf.Variable.name中的每一个变量。

变量的保存

tf.train.Saver() 声明一个管理模型中所有变量的Saver对象。

# Create some variables.
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")
...
# Add an op to initialize the variables.
init_op = tf.global_variables_initializer()

# Add ops to save and restore all the variables.
saver = tf.train.Saver()

# Later, launch the model, initialize the variables, do some work, save the
# variables to disk.
# 之后,运行模型,初始化变量,运行些操作,最后将变量保存在磁盘中。
with tf.Session() as sess:
  sess.run(init_op)
  # Do some work with the model.
  ..
  # Save the variables to disk.
  save_path = saver.save(sess, "/tmp/model.ckpt")
  print("Model saved in file: %s" % save_path)

变量的恢复

同样用Saver对象来恢复变量。当你从文件中恢复变量,你不需要再对他进行初始化操作。

# Create some variables.
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")
...
# Add ops to save and restore all the variables.
saver = tf.train.Saver()

# Later, launch the model, use the saver to restore variables from disk, and
# do some work with the model.
with tf.Session() as sess:
  # Restore variables from disk.
  saver.restore(sess, "/tmp/model.ckpt")
  print("Model restored.")
  # Do some work with the model
  ...

如果没有对tf.train.Saver() 这个对象传入任何参数,它会处理计算图中所有变量。每个变量名都会使用变量声明的时候的名字。

有时候为checkpoint files明确指定变量名是非常有用的。例如,你也许会用’weight’来训练每个变量,这个变量恢复的时候你也许会使用’params’来命名他。

你可以通过向tf.train.Saver() 传入一个python字典来简单粗暴地指定名字和需要保存的变量。

如果有需要的话,你可以声明多个saver对象,传入不同的参数来保存,用于恢复成不同的变量。相同的变量可以传入到多个saver对象中, 当restore() 方法被使用的时候value才会改变。

如果你在变量初始化之前保存了变量,你在恢复之后将变量初始化。详细请看tf.variables_initializer

# Create some variables.
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")
...
# Add ops to save and restore only 'v2' using the name "my_v2"
saver = tf.train.Saver({"my_v2": v2})
# Use the saver object normally after that.
...

感想

Tensorflow是我接触的第一个机器学习框架,目前还在学习一些非常基础的东西,所以写出来的可能有错,如果发现有错误,我很高兴你能指出我的错误。

对于像我这样的初学者来说,看中文档已经是很辛苦了,所以自己翻译一篇看看,结果发现官方写的很精彩,我翻译的过程也学到了很多。

门槛是有的,Tensorflow对数学的要求也比较高,下学期才学概率论和线性代数,在学习Tensorflow的过程中只能自学一下,离写个像样的模型还有很长的路要走。

自己开的坑,跪着也要跳下去。