TensorFlow实例-MNIST
Data:
MNIST link: http://yann.lecun.com/exdb/mnist
事实上TensorFlow提供了一个类来处理MNIST
from tensorflow.examples.tutorials.mnist import input_data
Code
直接上代码, self-explain
|
|
Analysis
对结果的影响: 网络结构最重要,其他Moving average, regularization也会有或多或少的影响。
Improve
之前的定义inference的时候将所有的变量作为参数传入了函数。如果network层数增加就不方便这么写了。tf提供通过变量名称来创建或者获取一个变量的机制。函数: tf.get_variable和tf.variable_scope
|
|
tf中的初始化函数与生成函数对应,只是多一个Initializer后缀
tf.get_variable会根据名字去创建或者获取。通过tf.varialbe_scope来生成上下文,有点类似c++ namespace的意思。
Plus: 变量name会有:0,表示这个变量是生成变量这个运算的第一个结果
|
|
Storage
模型持久化。
saver = tf.train.Saver()
saver.save(sess, '/path/model.ckpt')
这个目录下会有三个文件,因为tf将计算图的结构和图上参数值分开保存。
model.ckpt.meta :计算图结构
Model.ckpt: 保存了tf中每一个变量的取值。
checkpoint: 保存了一个目录下所有的模型文件列表。
Load
加载
saver = tf.train.Saver()
saver.restore(sess, 'path/model.ckpt')
注意直接加载参数值的话,还是需要事先定好与之前保存的同样的结构,但是不需要tf.global_varilabe_initializer()。
加载之后可以通过张量的名字来获取张量
print (sess.run(tf.get_default_graph().get_tensor_by_name('add:0')))
直接加载图
|
|
可以通过给Saver([v1])参数来指定保存的变量,也可以通过给字典参数来重命名被加载的变量与当前变量一致。saver = tf.train.Saver({‘v1’:v1, ‘v2’:v2})。
这样的目的主要是为了方便使用滑动平均值。
|
|
tf提供了convert_variables_to_constant来将计算图中的变量以及取值通过常量的方式保存,这个整个tf计算图放在一个文件中。
|
|
A more elegant implementation
符合解耦的软工要求的实现,将之前的代码分成了三部分,值得借鉴参考
|
|