标题:six_questions_of_tf
内容:
一. tf variable_scope与tf.name_scope
二.tf.get_variable()和tf.Variable()
三.global_step=tf.Variable(0, trainable=False)
四.保存检查点(checkpoint)
五.padding 0时,为什么左边也要padding
六.单层卷积和池化提取图片特征
正文如下:
一、 with tf variable_scope的作用
主要作用:在一个 variable_scope 作用域下内共享变量
tf.name_scope()和tf.variable_scope()是两个作用域,一般与两个创建/调用变量的函数tf.variable() 和tf.get_variable()搭配使用。
它们搭配在一起的两个常见用途:1)变量共享,#2)tensorboard画流程图时为了可视化封装变量
###1.共享变量的使用及举例
变量共享主要涉及两个函数:
tf.get_variable(
tf.variable_scope(
TF中有两种作用域类型
命名域 (name scope),可通过tf.name_scope 或 tf.op_scope创建;
变量域 (variable scope),可通过tf.variable_scope 或 tf.variable_op_scope创建
代码举例:
代码举例:以下代码运行第一次没问题,运行第二次会报错
所以:命名域 (name scope) 、变量域 (variable scope),这两种作用域的使用有区别¶
在variable_scope的作用域下,tf.get_variable()和tf.Variable()都加了scope_name 前缀, 因此,必须在tf.variable_scope的作用域下,通过get_variable()可以使用已经创建的变量,实现了变量的共享。
在name_scope的作用域下,通过tf.get_variable()方式创建的变量,只有variable scope名称会加到变量名称前面,而name scope不会作为前缀; 通过tf.variable()创建的变量,name scope 和variable scope都会加到变量名称前面
### TF中创建变量的方式有两种:tf.get_variable()和tf.Variable()
tf.get_variable(“vname”)方法,在创建变量时,如果这个变量vname已经存在,直接使用这个变量,如果不存在,则重新创建;
tf.Variable()在创建变量时,一律创建新的变量,如果这个变量已存在,则后缀会增加0、1、2等数字编号予以区别。
## 二、tf.varibales initialize
Tensorflow使用Variable类表达、更新、存储模型参数。
Variable是在可变更的,具有保持性的内存句柄,存储着Tensor。
在整个session运行之前,图中的全部Variable必须使用Tensor进行初始化。
### 在TensorFlow的世界里,变量的定义和初始化是分开的
所有关于图变量的赋值和计算都要通过tf.Session的run来进行,在执行完初始化之后,Variable中的值生成完毕,不会再变化。
想要将所有图变量进行集体初始化时应该使用tf.global_variables_initializer 或tf.initialize_all_variables()
## 三、global_step=tf.Variable(0, trainable=False)
global_step在滑动平均、优化器、指数衰减学习率等方面都有用到,这个变量的实际意义非常好理解:代表全局步数,比如在多少步该进行什么操作,现在神经网络训练到多少轮等等,类似于一个钟表。
根据代码可以发现global_step的初始化值是0:
global_step=tf.Variable(0, trainable=False)
问题:如果global_step直接赋值为0了,还怎么表示全局的步数?
## 四:保存检查点(checkpoint)
为了得到可以用来后续恢复模型以进一步训练或评估的检查点文件(checkpoint file),我们实例化一个tf.train.Saver。
saver = tf.train.Saver()
在训练循环中,将定期调用saver.save()方法,向训练文件夹中写入包含了当前所有可训练变量值的检查点文件。
saver.save(sess, FLAGS.train_dir, global_step=step)
这样,我们以后就可以使用saver.restore()方法,重载模型的参数,继续训练。
saver.restore(sess, FLAGS.train_dir)
## 五、padding 0时,为什么左边也要padding
1.使得左边和上边边缘有机会被卷积核滑动时,更多次数的提取到,
2.卷积前后图片的中心位置不变 (在卷积时,中心位置可能会有更多机会被卷积到,两边会更少)
ps:通常地,一般filter的高和宽都为奇数,一般为 3x3,或5x5,或7x7
(filter的大小不为奇数时,一般是padding_width/2=padding_left;padding_height/2=padding_top)