TensorFlow——共享变量的使用方法
1.共享变量用途
在构建模型时,需要使用tf.Variable来创建一个变量(也可以理解成节点)。当两个模型一起训练时,一个模型需要使用其他模型创建的变量,比如,对抗网络中的生成器和判别器。如果使用tf.Variable,将会生成一个新的变量,而我们需要使用原来的那个变量。这时就是通过引入get_Variable方法,实现共享变量来解决这个问题。这种方法可以使用多套网络模型来训练一套权重。
2.使用get_Variable获取变量
get_Variable一般会配合Variable_scope一起使用,以实现共享变量。Variable_scope的含义是变量作用域。在某一作用域中的变量可以被设置成共享的方式,被其他网络模型使用。
get_Variable函数的定义如下:
tf.get_Variable(<name>, <shape>, <initializer>)
在TensorFlow里,使用get_Variable时候生成的变量是以指定的name属性为唯一标识,并不是定义的变量名称。使用时一般是通过name属性定位到具体变量,并将其共享到其他的模型中。
import tensorflow as tf
import numpy as np var1 = tf.Variable(1.0, name='first_var')
print("var1: ", var1.name) var1 = tf.Variable(2.0, name='first_var')
print('var1: ', var1.name) var2 = tf.Variable(3.0)
print('var2: ', var2.name) var2 = tf.Variable(4.0)
print('var1: ', var2.name) with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print("var1=", var1.eval())
print("var2=", var2.eval())
print()
在上述的代码中,,可以看到内存中有两个var1,并且他们的name是不一样的,对于图来说,后面的var1是生效的。当Variable定义没有指定名字时,系统会自动的加上一个名字Variable:0
3.get_Variable用法演示
import tensorflow as tf
import numpy as np get_var1 = tf.get_variable('firat_var_1', [1], initializer=tf.constant_initializer(2))
print("var1: ", get_var1.name) get_var1 = tf.get_variable('firat_var_2', [1], initializer=tf.constant_initializer(3))
print("var1: ", get_var1.name) with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print("var1=", get_var1.name)
print("var1=", get_var1.eval())
使用不同的name定义变量,当使用相同的name时,会抛出异常,变量名可以相同,但是name是不能相同的。
如果要使用相同的name的话,我们需要使用variable_scope将他们隔开,看如下代码:
import tensorflow as tf with tf.variable_scope('test_1'):
var1 = tf.get_variable('first_var', shape=[2], dtype=tf.float32) with tf.variable_scope('test_2'):
var1 = tf.get_variable('first_var', shape=[2], dtype=tf.float32) print("var1:", var1.name)
print("var1:", var1.name)
根据程序的运行结果,我们可以发现变量的名字加上了作用域的名称,这样使得我们能够在不同的作用域下面定义name相同的变量,同时,scope还支持嵌套定义,
with tf.variable_scope('test_0'):
with tf.variable_scope('test_1'):
var1 = tf.get_variable('first_var', shape=[2], dtype=tf.float32) with tf.variable_scope('test_2'):
var1 = tf.get_variable('first_var', shape=[2], dtype=tf.float32) print("var1:", var1.name)
print("var1:", var1.name)
4.共享作用域
使用作用域中的参数reuse可以实现共享变量功能
在variable_scope里面有一个reuse=True属性,表示使用已经定义过的变量,这时,get_variable将不会在创建新的变量,而是去图中get_variable所创建的变量中找与name相同的变量。
import tensorflow as tf with tf.variable_scope('test_0'):
var1 = tf.get_variable('first_var', shape=[2], dtype=tf.float32)
with tf.variable_scope('test_2'):
var2 = tf.get_variable('first_var', shape=[2], dtype=tf.float32) with tf.variable_scope('test_0', reuse=True):
var3 = tf.get_variable('first_var', shape=[2], dtype=tf.float32)
with tf.variable_scope('test_2'):
var4 = tf.get_variable('first_var', shape=[2], dtype=tf.float32) print("var1:", var1.name)
print("var2:", var2.name) print("var3:", var3.name)
print("var4:", var4.name)
在上述的输出结果中,我们可以看到,var1和var3的名字一样,var2和var4的名字一样,则表明他们是同一个变量,如此就实现了变量的共享。在实际应用中,可以将1,2和3,4分别放在不同的模型进行训练,但是他们会作用于同一个模型的学习参数上。
使用anaconda的spyder工具运行时,代码只能运行一次,第二次运行将会报错。可以退出当前的kernel,再重新进入一下,因为tf.get_varibale在创建变量时,会去检查图中是否已经创建过该变量,如果创建过且不是共享的方式,则会报错。
因而可以使用tf.reset_default_graph(),将图里面的变量清空,就可以解决这个问题。
5.初始化共享变量
variable_scope和get_variable都具有初始化的功能。在初始化时,如果没有对当前变量初始化,则TensorFlow会默认使用作用域的初始化,并且作用域的初始化方法也有继承功能。
import tensorflow as tf with tf.variable_scope('test_0', initializer=tf.constant_initializer(0.15)):
var1 = tf.get_variable('first_var', shape=[2], dtype=tf.float32)
with tf.variable_scope('test_2'):
var2 = tf.get_variable('first_var', shape=[2], dtype=tf.float32)
var3 = tf.get_variable('first_var_2', shape=[2], initializer=tf.constant_initializer(0.315)) with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print("var1:", var1.eval())
print("var2:", var2.eval())
print("var3:", var3.eval())
当变量没有进行初始化时,会继承它的域的初始化方式,域也会继承它的上一级的域的初始化方式。在多模型训练时,常常可以对模型中的张量进行分区,同时,同一进行初始化。在变量共享方面,可以使用tf.AUTO_REUSE来为reuse属性赋值。tf。AUTO_REUSE可以实现第一次调用variable_scope时,传入reuse的值为false,再次调用时,reuse的值为True。
6.作用域与操作符的受限范围
variable_scope还可以使用with variable_scope as xxxscope的方式定义作用域,当使用这种方式时,将不会在受到外层的scope所限制。
import tensorflow as tf with tf.variable_scope('test2', initializer=tf.constant_initializer(1.5)) as sp:
var1 = tf.get_variable('var1', [2], dtype=tf.float32) print(sp.name)
print(var1.name) with tf.variable_scope('test1', dtype=tf.float32, initializer=tf.constant_initializer(5.5)):
var2 = tf.get_variable('var1', [2], dtype=tf.float32)
with tf.variable_scope(sp) as sp1:
var3 = tf.get_variable('var2', [2], dtype=tf.float32) print("var2:", var2.name) print("var3:", var3.name) with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print("var2:", var2.eval())
print("var2:", var3.eval())
通过with tf.variable_scope(sp) as sp1我们可知其没有收到外层的作用域所限制,初始化的操作时,它的值不是外层作用域的初始化值,而是指定的作用域的初始化的值。
对于操作符而言,不仅收到tf.name_scope限制还收到tf.variable_scope限制。
import tensorflow as tf
import numpy as np with tf.variable_scope('scope'):
with tf.name_scope('op'):
v = tf.get_variable('var1', [1])
x = v + 2.0 print("v:", v.name)
print('x', x.name)
根据结果,我们可知,通过添加tf.name_scope('op'):作用域时,变量的命名并没有收到限制,只是改变了op的命名,通过tf.name_scope(''):还可以返回到顶层的作用域中。
import tensorflow as tf
import numpy as np with tf.variable_scope('scope'):
var1 = tf.get_variable("v", [1]) with tf.variable_scope('scope_1'):
var2 = tf.get_variable("v", [1]) with tf.name_scope(''):
var3 = tf.get_variable('var1', [1])
x = var3 + 2.0 print("var1 ", var1.name)
print('var2 ', var2.name)
print('var3 ', var3.name)
print('x ', x.name)
通过将通过tf.name_scope('')设置为空,对于变量名是没有影响,但是可以看到x的命名,它已经变成了最外层的命名了。
TensorFlow——共享变量的使用方法的更多相关文章
- 安装tensorflow的最简单方法(Ubuntu 16.04 && CentOS)
先说点题外话:在用anaconda安装很多次tensorflow失败之后,我放弃了,如果你遇到这样的问题:Traceback (most recent call last)-如果不是因为pip版本,就 ...
- TensorFlow之Varibale 使用方法
------------------------------------------- 转载请注明: 来自博客园 xiuyuxuanchen 地址:http://www.cnblogs.com/gre ...
- tensorflow共享变量 the difference between tf.Variable() and get_variable()
一般这样用tf.get_variable(): v = tf.get_variable(name, shape, dtype, initializer) 下面内容来源于 http://blog.csd ...
- TensorFlow 常用函数与方法
摘要:本文主要对tf的一些常用概念与方法进行描述. tf函数 TensorFlow 将图形定义转换成分布式执行的操作, 以充分利用可用的计算资源(如 CPU 或 GPU.一般你不需要显式指定使用 CP ...
- 『TensorFlow』正则化添加方法整理
一.基础正则化函数 tf.contrib.layers.l1_regularizer(scale, scope=None) 返回一个用来执行L1正则化的函数,函数的签名是func(weights). ...
- 『cs231n』通过代码理解gan网络&tensorflow共享变量机制_上
GAN网络架构分析 上图即为GAN的逻辑架构,其中的noise vector就是特征向量z,real images就是输入变量x,标签的标准比较简单(二分类么),real的就是tf.ones,fake ...
- TensorFlow Saver的使用方法
我们经常在训练完一个模型之后希望保存训练的结果,这些结果指的是模型的参数,以便下次迭代的训练或者用作测试.Tensorflow针对这一需求提供了Saver类. Saver类提供了向checkpoint ...
- 吴裕雄 python 神经网络——TensorFlow 数据集基本使用方法
import tempfile import tensorflow as tf input_data = [1, 2, 3, 5, 8] dataset = tf.data.Dataset.from_ ...
- VLC各个Module模块之间共享变量的实现方法
在做VLC开发的时候,想使用一个模块访问另外一个模块的数据, 比如在网络模块得到了一些数据,想在其他模块得到这些数据进行处理,这时候就需要两个模块共享一些变量. 查看VLC的源码,发现VLC专门有va ...
随机推荐
- TCP/IP网络编程之优于select的epoll(一)
epoll的理解及应用 select复用方法由来已久,因此,利用该技术后,无论如何优化程序性能也无法同时接入上百个客户端.这种select方式并不适合以web服务端开发为主流的现代开发环境,所以要学习 ...
- 利用python多线程模块实现模拟接口并发
import requestsimport jsonimport threadingimport timeimport uuid class postrequests(): def __init__( ...
- Python-S9-Day122-Python爬虫
11 初识爬虫 11 初识爬虫 12 今日作业 11.1 初识黄页: 11.2 互联网就是一张大的蜘蛛网: 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种 ...
- Python基础-week03 集合 , 文件操作 和 函数详解
一.集合及其运算 1.集合的概念 集合是一个无序的,不重复的数据组合,它的主要作用如下 *去重,把一个列表变成集合,就自动去重了 *关系测试,测试两组数据之前的交集.并集.差集.子集.父级.对称差集, ...
- Zookeeper 增删改查
初始化对象连接到zookeeper服务: public ZooKeeper initZk(){ final CountDownLatch countDownLatch = new CountDownL ...
- idea中将项目与github关联
© 版权声明:本文为博主原创文章,转载请注明出处 1.在github中创建一个账号:https://github.com/join?source=header-home 2.下载并安装git:http ...
- POJ-1087 二分图匹配,最大流。
A Plug for UNIX 题意很迷,不过很水. 题意:一个房间有m个插座,每个插座有一个型号, ...
- POJ 3268 Silver Cow Party 最短路—dijkstra算法的优化。
POJ 3268 Silver Cow Party Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbe ...
- Nginx概述与安装
什么是Nginx 一款服务器软件,类似于Apache.Tomcat Nginx还是一款HTTP和反向代理服务器,同时也是一个代理邮件服务器.除了实现网站发布的功能外,还可以提供负载均衡. 所谓负载均衡 ...
- NOIP试题解析
NOIP试题解析 by QTY_YTQ noip2010关押罪犯(并查集) 题意是有n个罪犯关在两个监狱中,其中有m对罪犯有仇恨关系,如果有仇恨的罪犯关在一起会产生一定影响力的事件 ...