tensorflow API简单整理(二、变量共享)

本文介绍了TensorFlow中变量共享的重要性和方法,包括使用tf.get_variable()和tf.variable_scope()。详细阐述了如何通过设置scope的reuse参数来实现变量的复用,并提供了代码示例,演示了在不同scope下创建和共享变量的步骤。文章还提到了稀疏变量更新,但未展开讨论。
摘要由CSDN通过智能技术生成

这是比较重要的一节,或者说,是比较难搞懂的一个部分,说实在,我也不知道自己有没有搞清楚,先尝试着写一下,看看能不能写清楚。可同时参考菜鸟学院tensorflow 翻译教程的共享变量部分

tensorflow的实用变量方法为tf.Variable()函数,在每次调用时,都会简单的生成一个新的变量。如果想高效的共享变量,就要使用tf.get_variable()和tf.variable_scope()这两方面的函数。

在java或者c中,变量限制使用的方式一般为先定义一个空间,然后在这个空间中定义变量。在tf中,为了使模块更加的解耦,将变量的定义和空间(scope)的定义分开,这样可以使变量的定义更加复用。然后在使用中可以使用tf.get_variable()搜索确定的变量,当然,也可以scope中对var进行定义。

首先来看var的定义,tf.get_variable(name,shape = None,dtype = tf.float32,initializer = None,trainable = True,collections = None) 一般需要传入name,shape和initializer,initializer常用的有三个:tf.constant_initializer(value)/tf.random_uniform_initializer(a,b)/tf.random_normal_initializer(mean,stddev)分别是常数的初始化值,平均的初始化值和正态分布的初始化值。

在tensorflow中使用包含scope的变量,有两种处理方式:

(1)先定义scope,然后在该scope中使用get_variable()函数,过程如下:

 
 
 
with tf.variable_scope("foo"):
    v = tf.get_variable("v",[1])

在scope下创建了一个全名为“foo/v:0”的变量,然后将scope的reuse设置为True,即可对该变量进行共享和访问

 
 
 
with tf.variable_scope("foo",resue = True):
    v1 = tf.get_variable("v",[1])

只有将scope的reuse 参数设置为True,才能get到variable,否则会抛出错误。

(2)在tensorflow如果想使变量可以进行复用,通常应采用以下的步骤:

  • 构造变量的时候,使用tf.get_variable()函数进行构造。

     
       
       
    def con_relu(input,kernel_shape,bias_shape):
        weights = tf.get_variable("weights",kernel_shape,initializer = tf.random_normal_initializer())
        biases  = tf.get_variable("biases" ,kernel_shape,initializer = tf.random_normal_initializer())
        conv = tf.nn.conv2d(input,weights,strides = [1,1,1,1],padding = "SAME")
        return tf.nn.relu(conv + biases)
  • 在使用的时候,增加with tf.Variable_scope("name") as scope,这样可以将该变量限制在该命名空间之内,形成了一个以此scope+name的一个全限定名,这样可以实现变量的复用。

     
       
       
    def my_image_fileter(input_images):
        with tf.variable("conv1"):
            relu1 = conv_relu(input_images,[5,5,32,32],[32])
        with tf.variable("conv2"):
            return conv_relu(relu1,[5,5,32,32],[32])
  • 之后,就可以该函数进行调用,但是因为默认的scope的reuse为False,需要将之设置为True之后才能使之共享。

     
       
       
    with tf.variable_scope("image_filters") as upper_scope:
        result1 = my_image_filter(image1)
        upper_scope.reuse_variables()
        result2 = my_image_filter(image2)
  • 这里采用的scope 的层结构,也就是说,本层(conv1/conv2)的resue为默认的False,可以增加一个他们的上层(upper_scope),然后将这一层reuse设置为True,其子层自动设置为True。

    *这里敬请小心。

变量部分python api还有一个稀疏变量更新,这一部分我不感兴趣,先不整理了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值