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的命名,它已经变成了最外层的命名了。

原文地址:https://www.cnblogs.com/baby-lily/p/10934131.html

时间: 2024-08-29 15:52:17

TensorFlow——共享变量的使用方法的相关文章

调用tensorflow中的concat方法时Expected int32, got list containing Tensors of type &#39;_Message&#39; instead.

grid = tf.concat(0, [x_t_flat, y_t_flat, ones])#报错语句 grid = tf.concat( [x_t_flat, y_t_flat, ones],0) #楼主改后的代码 将数字放在后面,如果有三个参数 decoder_inputs = tf.concat([go_inputs, decoder_inputs_tmp], 1,name="dec_in") 调用tensorflow中的concat方法时Expected int32, got

VLC各个Module模块之间共享变量的实现方法

在做VLC开发的时候,想使用一个模块访问另外一个模块的数据, 比如在网络模块得到了一些数据,想在其他模块得到这些数据进行处理,这时候就需要两个模块共享一些变量. 查看VLC的源码,发现VLC专门有variables.h和variables.c是用来处理变量的.它提供了一些方法可以创建VLC变量.设置VLC变量.改变.销毁VLC变量等. 当我们要产生一个VLC变量的时候,我们使用var_Create()函数: 如在UDP模块创建了一个变量, vlc_value_t valTemp; var_Cre

TensorFlow之Varibale 使用方法

------------------------------------------- 转载请注明: 来自博客园 xiuyuxuanchen 地址:http://www.cnblogs.com/greentomlee/ ------------------------------------------- Varibale 使用方法 实例: 实例讲解: 首先: #!/usr/bin/env python 这句话是指定python的运行环境,这种指定方式有两种,一种是指定python的路径---#

TensorFlow Saver的使用方法

我们经常在训练完一个模型之后希望保存训练的结果,这些结果指的是模型的参数,以便下次迭代的训练或者用作测试.Tensorflow针对这一需求提供了Saver类. Saver类提供了向checkpoints文件保存和从checkpoints文件中恢复变量的相关方法.Checkpoints文件是一个二进制文件,它把变量名映射到对应的tensor值 . 只要提供一个计数器,当计数器触发时,Saver类可以自动的生成checkpoint文件.这让我们可以在训练过程中保存多个中间结果.例如,我们可以保存每一

TensorFlow 常用函数与方法

摘要:本文主要对tf的一些常用概念与方法进行描述. tf函数 TensorFlow 将图形定义转换成分布式执行的操作, 以充分利用可用的计算资源(如 CPU 或 GPU.一般你不需要显式指定使用 CPU 还是 GPU, TensorFlow 能自动检测.如果检测到 GPU, TensorFlow 会尽可能地利用找到的第一个 GPU 来执行操作. 并行计算能让代价大的算法计算加速执行,TensorFlow也在实现上对复杂操作进行了有效的改进.大部分核相关的操作都是设备相关的实现,比如GPU.下面是

吴裕雄 python 神经网络——TensorFlow 数据集基本使用方法

import tempfile import tensorflow as tf input_data = [1, 2, 3, 5, 8] dataset = tf.data.Dataset.from_tensor_slices(input_data) # 定义迭代器. iterator = dataset.make_one_shot_iterator() # get_next() 返回代表一个输入数据的张量. x = iterator.get_next() y = x * x with tf.S

TensorFlow的数据读取方法

Tensorflow一共提供了3种读取数据的方法:第一种方法个人感觉比较麻烦:在TensorFlow程序运行的每一步, 让Python代码来供给数据,比如说用PIL和numpy处理数据,然后输入给神经网络.第二种方法:从文件读取数据,在TensorFlow图的起始, 让一个输入管线从文件中读取数据:string_input_producer()和slice_input_producer(). 他们两者区别可以简单理解为:string_input_producer每次取出一个文件名.slice_i

windows安装tensorflow简单直接的方法(win10+pycharm+tensorflow-gpu1.7+cuda9.1+cudnn7.1)

安装tensorflow-gpu环境需要:python环境,tensorflow-gpu包,cuda,cudnn 一,安装python,pip3直接到官网下载就好了,下载并安装你喜欢的版本 https://www.python.org/ 提示:安装最后一步时记得勾选添加环境变量 在cmd输入pip3测试pip3能否使用,不能使用的话,手动打开python安装的路径,找到pip3文件,将路径加入环境变量 二,安装tensorflow-gpu 使用pip3安装即可:pip3 install tens

tensorflow冻结层的方法

其实常说的fine tune就是冻结网络前面的层,然后训练最后一层.那么在tensorflow里如何实现finetune功能呢?或者说是如何实现冻结部分层,只训练某几个层呢?可以通过只选择优化特定层的参数来实现该功能. 示例代码如下: #定义优化算子 optimizer = tf.train.AdamOptimizer(1e-3) #选择待优化的参数 output_vars = tf.get_collection(tf.GraphKyes.TRAINABLE_VARIABLES, scope='