好玩的人工智能
快乐的深度学习

TensorFlow入门(三)–变量:创建、初始化、保存和加载

变量:创建、初始化、保存和加载

当训练模型时,用变量来存储和更新参数。变量包含张量 (Tensor)存放于内存的缓存区。建模时它们需要被明确地初始化,模型训练后它们必须被存储到磁盘。这些变量的值可在之后模型训练和分析是被加载。

本文档描述以下两个TensorFlow类。点击以下链接可查看完整的API文档:

tf.Variable 类
tf.train.Saver 类
创建

当创建一个变量时,你将一个张量作为初始值传入构造函数Variable()。TensorFlow提供了一系列操作符来初始化张量,初始值是常量或是随机值。

注意,所有这些操作符都需要你指定张量的shape。那个形状自动成为变量的shape。变量的shape通常是固定的,但TensorFlow提供了高级的机制来重新调整其行列数

weights=tf.Variable(tf.random_normal([784,200],stddev=0.35),name="weights")
biases=tf.Variable(tf.zeros([200]),name="biases")

 

调用tf.Variable()添加一些操作(Op,operation)到graph:

一个Variable操作存放变量的值。
一个初始化op将变量设置为初始值。这事实上是一个tf.assign操作.
初始值的操作,例如示例中对biases变量的zeros操作也被加入了graph。
tf.Variable的返回值是Python的tf.Variable类的一个实例。

初始化

变量的初始化必须在模型的其它操作运行之前先明确地完成。最简单的方法就是添加一个给所有变量初始化的操作,并在使用模型之前首先运行那个操作。

你或者可以从检查点文件中重新获取变量值,详见下文。

使用tf.global_variables_initializer()添加一个操作对变量做初始化。记得在完全构建好模型并加载之后再运行那个操作。

w = tf.Variable(tf.random_normal([784, 200], stddev=0.35), name = "weights")
bises = tf.Variable(tf.zeros([200]), name="biases")
sess = tf.Session()
2018-07-25 14:40:31.849819: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1534] Adding visible gpu devices: 0
2018-07-25 14:40:31.849899: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1015] Device interconnect StreamExecutor with strength 1 edge matrix:
2018-07-25 14:40:31.849920: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1021] 0
2018-07-25 14:40:31.849936: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1034] 0: N
2018-07-25 14:40:31.850226: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1147] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 7068 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080, pci bus id: 0000:01:00.0, compute capability: 6.1)
init = tf.global_variables_initializer()
print sess.run(bises)
[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. 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. 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. 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.
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. 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. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0.]
print sess.run(w)
[[ 0.26122916 -0.00275388 -0.67257357 ... 0.09995139 0.22123566
-0.02747542]
[-0.18481769 -0.31850645 0.30262214 ... -0.38780567 -0.0452748
-0.49446583]
[ 0.2861446 -0.00419489 -0.08906525 ... -0.27221295 0.31771848
0.10811804]
...
[-0.01201629 -0.01028737 0.17659996 ... -0.17887592 0.24207707
0.36280435]
[-0.12852211 0.33685264 0.33005074 ... 0.391571 0.11607578
-0.08759847]
[-0.20702675 -0.01009876 0.24286772 ... 0.00179149 -0.1544429
0.23184256]]

 

由另一个变量初始化

你有时候会需要用另一个变量的初始化值给当前变量初始化。由于tf.initialize_all_variables()是并行地初始化所有变量,所以在有这种需求的情况下需要小心。

用其它变量的值初始化一个新的变量时,使用其它变量的initialized_value()属性。你可以直接把已初始化的值作为新变量的初始值,或者把它当做tensor计算得到一个值赋予新变量。

w2 = tf.Variable(w.initialized_value(), name="w2")
w_twice = tf.Variable(w.initialized_value()*2, name="w_twice")
sess = tf.Session()
2018-07-25 14:46:32.897270: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1534] Adding visible gpu devices: 0
2018-07-25 14:46:32.897351: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1015] Device interconnect StreamExecutor with strength 1 edge matrix:
2018-07-25 14:46:32.897372: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1021] 0
2018-07-25 14:46:32.897389: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1034] 0: N
2018-07-25 14:46:32.897698: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1147] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 7068 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080, pci bus id: 0000:01:00.0, compute capability: 6.1)
sess.run(tf.global_variables_initializer())
print sess.run(w2)
[[-0.25378263 -0.2181623 0.31163314 ... 0.38136786 0.02508414
0.32680202]
[-0.21460824 -0.3163885 -0.12403991 ... -0.13686036 0.03880492
-0.3616999 ]
[ 0.6645146 -0.28422403 -0.1526471 ... 1.2582804 -0.42399302
0.04441564]
...
[-0.09874936 -0.01830273 0.22415362 ... 0.31903958 0.56807506
-0.45412812]
[ 0.12189247 0.27108067 -0.13126656 ... -0.6098068 -0.01932533
-0.27525625]
[-0.29061803 -0.00518653 0.11400329 ... -0.01371368 -0.78546154
0.63608456]]
print sess.run(w_twice)
[[-0.50756526 -0.4363246 0.6232663 ... 0.7627357 0.05016827
0.65360403]
[-0.42921647 -0.632777 -0.24807982 ... -0.2737207 0.07760984
-0.7233998 ]
[ 1.3290292 -0.56844807 -0.3052942 ... 2.5165608 -0.84798604
0.08883128]
...
[-0.19749872 -0.03660547 0.44830725 ... 0.63807917 1.1361501
-0.90825623]
[ 0.24378495 0.54216135 -0.26253313 ... -1.2196136 -0.03865065
-0.5505125 ]
[-0.58123606 -0.01037306 0.22800657 ... -0.02742735 -1.5709231
1.2721691 ]]

 

自定义初始化

tf.initialize_all_variables()函数便捷地添加一个op来初始化模型的所有变量。你也可以给它传入一组变量进行初始化。详情请见Variables Documentation,包括检查变量是否被初始化。

保存和加载

最简单的保存和恢复模型的方法是使用tf.train.Saver对象。构造器给graph的所有变量,或是定义在列表里的变量,添加save和restoreops。saver对象提供了方法来运行这些ops,定义检查点文件的读写路径。

检查点文件

变量存储在二进制文件里,主要包含从变量名到tensor值的映射关系。

当你创建一个Saver对象时,你可以选择性地为检查点文件中的变量挑选变量名。默认情况下,将每个变量Variable.name属性的值。

保存变量

用tf.train.Saver()创建一个Saver来管理模型中的所有变量。

sess.run(tf.global_variables_initializer())

save_path = saver.save(sess, "/tmp/model.ckpt")
print save_path
/tmp/model.ckpt

 

恢复变量

用同一个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()传入任何参数,那么saver将处理graph中的所有变量。其中每一个变量都以变量创建时传入的名称被保存。

有时候在检查点文件中明确定义变量的名称很有用。举个例子,你也许已经训练得到了一个模型,其中有个变量命名为”weights”,你想把它的值恢复到一个新的变量”params”中。

有时候仅保存和恢复模型的一部分变量很有用。再举个例子,你也许训练得到了一个5层神经网络,现在想训练一个6层的新模型,可以将之前5层模型的参数导入到新模型的前5层中。

你可以通过给tf.train.Saver()构造函数传入Python字典,很容易地定义需要保持的变量及对应名称:键对应使用的名称,值对应被管理的变量。

注意:

如果需要保存和恢复模型变量的不同子集,可以创建任意多个saver对象。同一个变量可被列入多个saver对象中,只有当saver的restore()函数被运行时,它的值才会发生改变。
如果你仅在session开始时恢复模型变量的一个子集,你需要对剩下的变量执行初始化op。详情请见tf.initialize_variables()。

# 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入门(三)–变量:创建、初始化、保存和加载
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

零点智能 人工智能社区,加Q群:469331966

投稿&建议&加Q群