溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python的f.name_scope和tf.variable_scope函數(shù)有什么區(qū)別

發(fā)布時(shí)間:2022-05-05 09:30:41 來(lái)源:億速云 閱讀:162 作者:zzz 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容主要講解“python的f.name_scope和tf.variable_scope函數(shù)有什么區(qū)別”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“python的f.name_scope和tf.variable_scope函數(shù)有什么區(qū)別”吧!

兩者區(qū)別

tf.name_scope()和tf.variable_scope()是兩個(gè)作用域,一般與兩個(gè)創(chuàng)建/調(diào)用變量的函數(shù)tf.variable() 和tf.get_variable()搭配使用。

為什么要使用兩個(gè)不同的作用域方式呢?其主要原因與變量共享相關(guān)。

變量共享主要涉及兩個(gè)函數(shù):tf.Variable() 和tf.get_variable()

在tf.variable_scope的作用域下需要使用tf.get_variable()函數(shù),這是因?yàn)閠f.get_variable()擁有一個(gè)變量檢查機(jī)制,會(huì)檢測(cè)已經(jīng)存在的變量是否設(shè)置為共享變量,當(dāng)同名變量存在共享機(jī)制時(shí),不會(huì)報(bào)錯(cuò),如果并未設(shè)置為共享變量,則報(bào)錯(cuò)。

如果使用tf.Variable() 的話每次都會(huì)新建變量。但是很多時(shí)候我們希望重用一些變量,所以我們使用到了get_variable(),它會(huì)去搜索變量名,有就直接用,沒(méi)有再新建。
在進(jìn)行變量共享的時(shí)候需要使用到標(biāo)志reuse,當(dāng)reuse = True時(shí)是可以共享,F(xiàn)alse時(shí)不可以共享。

tf.variable_scope函數(shù)

tf.variable_scope(
    name_or_scope,
    default_name=None,
    values=None,
    initializer=None,
    regularizer=None,
    caching_device=None,
    partitioner=None,
    custom_getter=None,
    reuse=None,
    dtype=None,
    use_resource=None,
    constraint=None,
    auxiliary_name_scope=True
)

其中:

1、name_or_scope:范圍的名稱。

2、default_name:如果name_or_scope參數(shù)為None,則使用默認(rèn)的名稱,該名稱將是唯一的;如果提供了name_or_scope,它將不會(huì)被使用,因此它不是必需的,并且可以是None。

3、values:傳遞給操作函數(shù)的Tensor參數(shù)列表。

4、initializer:此范圍內(nèi)變量的默認(rèn)初始值設(shè)定項(xiàng)。

5、regularizer:此范圍內(nèi)變量的默認(rèn)正規(guī)化器。

6、caching_device:此范圍內(nèi)變量的默認(rèn)緩存設(shè)備。

7、partitioner:此范圍內(nèi)變量的默認(rèn)分區(qū)程序。

8、custom_getter:此范圍內(nèi)的變量的默認(rèn)自定義吸氣。

9、reuse:可以是True、None或tf.AUTO_REUSE;如果是True,即可以開(kāi)始共享變量,變量重構(gòu)用;如果是tf.AUTO_REUSE,則我們創(chuàng)建變量(如果它們不存在),否則返回它們(用于在第一輪創(chuàng)建變量);如果是None,則我們繼承父范圍的重用標(biāo)志。

10、dtype:在此范圍中創(chuàng)建的變量類型。

測(cè)試代碼

1、使用reuse=True共享變量

import tensorflow as tf
# 初始化第一個(gè)v1
with tf.variable_scope("scope1"):
    v1 = tf.get_variable("v1",[3,3],tf.float32,initializer=tf.constant_initializer(1))
    print(v1.name)
# 不同的作用域
with tf.variable_scope("scope2"):
    v1 = tf.get_variable("v1",[3,3],tf.float32,initializer=tf.constant_initializer(1))
    print(v1.name)
# 開(kāi)始共享
with tf.variable_scope("scope1",reuse = True):
    v1_share = tf.get_variable("v1",[3,3],tf.float32,initializer=tf.constant_initializer(1))
    print(v1_share.name)

運(yùn)行結(jié)果為:

scope1/v1:0
scope2/v1:0
scope1/v1:0

如果在下部再加上

with tf.variable_scope("scope2"):
    v1_share = tf.get_variable("v1",[3,3],tf.float32,initializer=tf.constant_initializer(1))
    print(v1_share.name)

此時(shí)沒(méi)有reuse,不能共享,程序報(bào)錯(cuò)。

2、使用AUTO_REUSE共享變量

import tensorflow as tf
# 使用AUTO_REUSE可以直接創(chuàng)建
# 如果reuse = True,初始化第一輪創(chuàng)建的時(shí)候會(huì)報(bào)錯(cuò)
def demo():
  with tf.variable_scope("demo", reuse=tf.AUTO_REUSE):
    v = tf.get_variable("v", [1])
  return v
v1 = demo() 
v2 = demo()
print(v1.name)

運(yùn)行結(jié)果為:

demo/v:0
demo/v:0

到此,相信大家對(duì)“python的f.name_scope和tf.variable_scope函數(shù)有什么區(qū)別”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI