2019-03-14

标题: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了,还怎么表示全局的步数?

### trainable,为bool类型,如果为True,会把它加入到GraphKeys.TRAINABLE_VARIABLES,才能对它使用Optimizer。如果为False,则不进行optimizer

## 四:保存检查点(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)


## 六、单层卷积和池化,提取图片特征




你可能感兴趣的:(2019-03-14)