tf.Variable(), tf.get_variable(), tf.variable_scope(), tf.name_scope()——不同的变量创建方式决定了他们不同的用途

  • tf.get_variable() 创建变量的时候必须要提供 name

  • tf.Variable()创建变量之前不会检查是否有同样name的变量,但tf.get_variable() 会。
  • 因为上一条的原因,所以tf.get_variable() 可以方便共享变量,前提是要配合`tf.variable_scope()`使用。每个在tf.variable_scope()定义的变量命名空间之内创建的变量,都会检查name是否一样,若一样,则采取“变量共享”。但对于tf.Variable(),则是直接创建一个name后面多个“_1”的新变量,变量之间自然也是不共享的
  • tf.variable_scope() & tf.name_scope():
    • tf.name_scope() 主要是用来管理命名空间的,这样子让我们的整个模型更加有条理。
    • tf.variable_scope() 的作用是为了实现变量共享,它和 tf.get_variable() 一起,来完成变量共享的功能。
    • 在tf.name_scope()生成的命名空间内部,对于tf.get_variable()方法产生的变量没有任何限制能力——也就是说,name_scope定义的name不会显现在tf.get_variable()方法产生的变量的name上。
  • 总结:
    • tf.name_scope()是tensorflow帮我出了一套命名管理体系,好比你叫王二,你同学叫李四。然后有两个男人是他俩的爹,你闭着眼都知道王八肯定是王二他爹,李大是李四他爹一样。。。。。这有2张图,生动现实了命名空间name_scope的作用:

                                                                                              没有命名空间 

                                                                                                有命名空间

  • tf.variable_scope()和tf.get_variable()大多数时间是一起使用的,用法为先用tf.variable_scope()创建变量空间,然后在这个变量空间内用tf.variable_scope()创建可以共享的变量,同时这也要求了变量不可有一样的name(name一样你俩就共享了嘛)
  • tf.Variable()创建的变量可以受tf.name_scope()影响。创建的变量也不会被共享,name一样的话就会自动在name后面加后缀
  • 这样区分对于tensorflow程序而言,最大的意义是,对于weight和bias这种,每次进行卷积等操作都需要学习、更新的变量而言,变量的复用是必须的,所以weight和bias变量必须共享,否则几轮梯度下降下来出来了多少个weight和bias,就是去了梯度下降参数更新的意义了。如果用tf.varaible_scope() + tf.get_variable()一起定义共享变量,则每次更新的都是那么一套weight+bias,这就合理了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章