博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
tensorflow里建立变量(tf.Variable,tf.get_variable,tf.name_scope,f.variable_scope)
阅读量:2080 次
发布时间:2019-04-29

本文共 2126 字,大约阅读时间需要 7 分钟。

 

 一、

      对于使用tf.Variable来说,tf.name_scope和 tf.variable_scope功能一样,都是给变量加前缀,相当于分类管理。这样在不同的scope中就可以给变量取相同的名字也不会冲突。

二、

       对于tf.get_variable来说,tf.name_scope对其无效,只有在 tf.variable_scope中才可以建立共享变量。为什么需要共享变量呢?因为如果使用Variable 的话每次都会新建变量,但是大多数时候我们是希望一些变量重用的,所以就用到了get_variable()。它会去搜索变量名,然后没有就新建,有就直接用。

       scope.reuse_variables()  # 设置共享变量

三、

      tf.Variable()同名变量指向两个不同变量实体,而tf.get_variable ()同名变量则指向同一个变量实体。所以tf.Variable()的变量名称是可选参数,而tf.get_variable()的变量名称是必填参数。

四、

     tf.variable_scope()和tf.get_variable()必须要搭配使用。tf.Variable()可以单独使用,也可以搭配tf.name_scope()使用,使变量名自动加前缀。tf.Variable()和tf.variable_scope()搭配使用语法过关但是很奇怪,不是设计者的初衷。

代码例子:

import tensorflow as tfwith tf.name_scope('name_scope_x'):    var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)    var3 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32)    var4 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32)with tf.Session() as sess:    sess.run(tf.global_variables_initializer())    print(var1.name, sess.run(var1))    print(var3.name, sess.run(var3))    print(var4.name, sess.run(var4))# 输出结果:# var1:0 [-0.30036557]   可以看到前面不含有指定的'name_scope_x'# name_scope_x/var2:0 [ 2.]# name_scope_x/var2_1:0 [ 2.]  可以看到变量名自行变成了'var2_1',避免了和'var2'冲突

如果要共享变量,则需要使用tf.variable_scope()和 tf.get_variable()

import tensorflow as tfwith tf.variable_scope('variable_scope_y') as scope:    var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)    scope.reuse_variables()  # 设置共享变量    var1_reuse = tf.get_variable(name='var1')    var2 = tf.Variable(initial_value=[2.], name='var2', dtype=tf.float32)    var2_reuse = tf.Variable(initial_value=[2.], name='var2', dtype=tf.float32)with tf.Session() as sess:    sess.run(tf.global_variables_initializer())    print(var1.name, sess.run(var1))    print(var1_reuse.name, sess.run(var1_reuse))    print(var2.name, sess.run(var2))    print(var2_reuse.name, sess.run(var2_reuse))# 输出结果:# variable_scope_y/var1:0 [-1.59682846]# variable_scope_y/var1:0 [-1.59682846]   可以看到变量var1_reuse重复使用了var1# variable_scope_y/var2:0 [ 2.]# variable_scope_y/var2_1:0 [ 2.]

代码例子来源于:   作者:Cyril     地址: https://www.zhihu.com/question/54513728/answer/181819324

转载地址:http://lhkqf.baihongyu.com/

你可能感兴趣的文章
【MyBatis学习07】动态sql
查看>>
【MyBatis学习08】高级映射之一对一查询
查看>>
【MyBatis学习09】高级映射之一对多查询
查看>>
【MyBatis学习10】高级映射之多对多查询
查看>>
【MyBatis学习11】MyBatis中的延迟加载
查看>>
【MyBatis学习12】MyBatis中的一级缓存
查看>>
【MyBatis学习13】MyBatis中的二级缓存
查看>>
【MyBatis学习14】MyBatis和Spring整合
查看>>
【MyBatis学习15】MyBatis的逆向工程生成代码
查看>>
Java 中 final、finally 和 finalize 使用总结
查看>>
volatile关键字解析
查看>>
单例模式的八种写法比较
查看>>
比较常见的数据库SQL面试题以及答案
查看>>
MySQL与Oracle的区别
查看>>
关于Oracle数据库优化的几点总结
查看>>
69道Spring面试题和答案
查看>>
40个Java多线程问题总结
查看>>
Oracle数据库面试题
查看>>
java面试中的智力题
查看>>
本地如何连接hbase数据库
查看>>