一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

TensorFlow 變量:表示程序處理的共享持久狀態(tài)的最佳方法

Tensorflowers ? 來源:YXQ ? 2019-04-29 16:34 ? 次閱讀

TensorFlow 變量是表示程序處理的共享持久狀態(tài)的最佳方法。

我們使用 tf.Variable 類操作變量。tf.Variable 表示可通過對(duì)其運(yùn)行操作來改變其值的張量。與 tf.Tensor 對(duì)象不同,tf.Variable 存在于單個(gè) session.run 調(diào)用的上下文之外。

在 TensorFlow 內(nèi)部,tf.Variable 會(huì)存儲(chǔ)持久性張量。具體 op 允許您讀取和修改此張量的值。這些修改在多個(gè) tf.Session 之間是可見的,因此對(duì)于一個(gè) tf.Variable,多個(gè)工作器可以看到相同的值。

創(chuàng)建變量

創(chuàng)建變量的最佳方式是調(diào)用 tf.get_variable 函數(shù)。此函數(shù)要求您指定變量的名稱。其他副本將使用此名稱訪問同一變量,以及在對(duì)模型設(shè)置檢查點(diǎn)和導(dǎo)出模型時(shí)指定此變量的值。tf.get_variable 還允許您重復(fù)使用先前創(chuàng)建的同名變量,從而輕松定義重復(fù)利用層的模型。

要使用tf.get_variable創(chuàng)建變量,只需提供名稱和形狀即可

my_variable = tf.get_variable("my_variable", [1, 2, 3])

這將創(chuàng)建一個(gè)名為 “my_variable” 的變量,該變量是形狀為 [1, 2, 3] 的三維張量。默認(rèn)情況下,此變量將具有 dtypetf.float32,其初始值將通過 tf.glorot_uniform_initializer 隨機(jī)設(shè)置。

您可以選擇為 tf.get_variable 指定 dtype 和初始化器。例如:

my_int_variable = tf.get_variable("my_int_variable", [1, 2, 3], dtype=tf.int32, initializer=tf.zeros_initializer)

TensorFlow 提供了許多方便的初始化器?;蛘撸部梢詫?tf.Variable 初始化為 tf.Tensor 的值。例如:

other_variable = tf.get_variable("other_variable", dtype=tf.int32, initializer=tf.constant([23, 42]))

請(qǐng)注意,當(dāng)初始化器是 tf.Tensor 時(shí),您不應(yīng)指定變量的形狀,因?yàn)閷⑹褂贸跏蓟鲝埩康男螤睢?/p>

變量集合

由于 TensorFlow 程序的未連接部分可能需要?jiǎng)?chuàng)建變量,因此能有一種方式訪問所有變量有時(shí)十分受用。為此,TensorFlow 提供了集合,它們是張量或其他對(duì)象(如 tf.Variable 實(shí)例)的命名列表。

默認(rèn)情況下,每個(gè) tf.Variable 都放置在以下兩個(gè)集合中:

tf.GraphKeys.GLOBAL_VARIABLES- 可以在多臺(tái)設(shè)備間共享的變量

tf.GraphKeys.TRAINABLE_VARIABLES- TensorFlow 將計(jì)算其梯度的變量

如果您不希望變量可訓(xùn)練,可以將其添加到 tf.GraphKeys.LOCAL_VARIABLES 集合中。例如,以下代碼段展示了如何將名為 my_local 的變量添加到此集合中:

my_local = tf.get_variable("my_local", shape=(),collections=[tf.GraphKeys.LOCAL_VARIABLES])

或者,您可以指定 trainable=False(作為 tf.get_variable 的參數(shù)):

my_non_trainable = tf.get_variable("my_non_trainable", shape=(), trainable=False)

您也可以使用自己的集合。集合名稱可為任何字符串,且您無需顯式創(chuàng)建集合。創(chuàng)建變量(或任何其他對(duì)象)后,要將其添加到集合中,請(qǐng)調(diào)用 tf.add_to_collection。例如,以下代碼將名為 my_local 的現(xiàn)有變量添加到名為 my_collection_name 的集合中:

tf.add_to_collection("my_collection_name", my_local)

要檢索您放置在某個(gè)集合中的所有變量(或其他對(duì)象)的列表,您可以使用:

tf.get_collection("my_collection_name")

設(shè)備放置方式

與任何其他 TensorFlow 指令一樣,您可以將變量放置在特定設(shè)備上。例如,以下代碼段創(chuàng)建了名為 v 的變量并將其放置在第二個(gè) GPU 設(shè)備上:

with tf.device("/device:GPU:1"): v = tf.get_variable("v", [1])

在分布式設(shè)置中,將變量放置在正確設(shè)備上尤為重要。如果不小心將變量放在工作器而不是參數(shù)服務(wù)器上,可能會(huì)嚴(yán)重減慢訓(xùn)練速度,最壞的情況下,可能會(huì)讓每個(gè)工作器不斷復(fù)制各個(gè)變量。為此,我們提供了 tf.train.replica_device_setter,它可以自動(dòng)將變量放置在參數(shù)服務(wù)器中。例如:

cluster_spec = { "ps": ["ps0:2222", "ps1:2222"], "worker": ["worker0:2222", "worker1:2222", "worker2:2222"]}with tf.device(tf.train.replica_device_setter(cluster=cluster_spec)): v = tf.get_variable("v", shape=[20, 20]) # this variable is placed # in the parameter server # by the replica_device_setter

初始化變量

變量必須先初始化后才可使用。如果您在低級(jí)別 TensorFlow API 中進(jìn)行編程(即您在顯式創(chuàng)建自己的圖和會(huì)話),則必須明確初始化變量。tf.contrib.slim、tf.estimator.Estimator 和 Keras 等大多數(shù)高級(jí)框架在訓(xùn)練模型前會(huì)自動(dòng)為您初始化變量。

顯式初始化在其他方面很有用。它允許您在從檢查點(diǎn)重新加載模型時(shí)不用重新運(yùn)行潛在資源消耗大的初始化器,并允許在分布式設(shè)置中共享隨機(jī)初始化的變量時(shí)具有確定性。

要在訓(xùn)練開始前一次性初始化所有可訓(xùn)練變量,請(qǐng)調(diào)用 tf.global_variables_initializer()。此函數(shù)會(huì)返回一個(gè)操作,負(fù)責(zé)初始化 tf.GraphKeys.GLOBAL_VARIABLES 集合中的所有變量。運(yùn)行此操作會(huì)初始化所有變量。例如:

session.run(tf.global_variables_initializer())# Now all variables are initialized.

如果您確實(shí)需要自行初始化變量,則可以運(yùn)行變量的初始化器操作。例如:

session.run(my_variable.initializer)

您可以查詢哪些變量尚未初始化。例如,以下代碼會(huì)打印所有尚未初始化的變量名稱:

print(session.run(tf.report_uninitialized_variables()))

請(qǐng)注意,默認(rèn)情況下,tf.global_variables_initializer 不會(huì)指定變量的初始化順序。因此,如果變量的初始值取決于另一變量的值,那么很有可能會(huì)出現(xiàn)錯(cuò)誤。任何時(shí)候,如果您在并非所有變量都已初始化的上下文中使用某個(gè)變量值(例如在初始化某個(gè)變量時(shí)使用另一變量的值),最好使用 variable.initialized_value(),而非 variable:

v = tf.get_variable("v", shape=(), initializer=tf.zeros_initializer())w = tf.get_variable("w", initializer=v.initialized_value() + 1)

使用變量

要在 TensorFlow 圖中使用 tf.Variable 的值,只需將其視為普通 tf.Tensor 即可:

v = tf.get_variable("v", shape=(), initializer=tf.zeros_initializer())w = v + 1 # w is a tf.Tensor which is computed based on the value of v. # Any time a variable is used in an expression it gets automatically # converted to a tf.Tensor representing its value.

要為變量賦值,請(qǐng)使用 assign、assign_add 方法以及 tf.Variable 類中的友元。例如,以下就是調(diào)用這些方法的方式:

v = tf.get_variable("v", shape=(), initializer=tf.zeros_initializer())assignment = v.assign_add(1)tf.global_variables_initializer().run()sess.run(assignment) # or assignment.op.run(), or assignment.eval()

大多數(shù) TensorFlow 優(yōu)化器都有專門的 op,會(huì)根據(jù)某種梯度下降算法有效地更新變量的值。請(qǐng)參閱 tf.train.Optimizer,了解如何使用優(yōu)化器。

由于變量是可變的,因此及時(shí)了解任意時(shí)間點(diǎn)所使用的變量值版本有時(shí)十分有用。要在事件發(fā)生后強(qiáng)制重新讀取變量的值,可以使用 tf.Variable.read_value。例如:

v = tf.get_variable("v", shape=(), initializer=tf.zeros_initializer())assignment = v.assign_add(1)with tf.control_dependencies([assignment]): w = v.read_value() # w is guaranteed to reflect v's value after the # assign_add operation.

共享變量

TensorFlow 支持兩種共享變量的方式:

顯式傳遞tf.Variable對(duì)象

將tf.Variable對(duì)象隱式封裝在tf.variable_scope對(duì)象內(nèi)

雖然顯式傳遞變量的代碼非常清晰,但有時(shí)編寫在其實(shí)現(xiàn)中隱式使用變量的 TensorFlow 函數(shù)非常方便。tf.layers 中的大多數(shù)功能層以及所有 tf.metrics 和部分其他庫實(shí)用程序都使用這種方法。

變量作用域允許您在調(diào)用隱式創(chuàng)建和使用變量的函數(shù)時(shí)控制變量重用。作用域還允許您以分層和可理解的方式命名變量。

例如,假設(shè)我們編寫一個(gè)函數(shù)來創(chuàng)建一個(gè)卷積 /relu 層:

def conv_relu(input, kernel_shape, bias_shape): # Create variable named "weights". weights = tf.get_variable("weights", kernel_shape, initializer=tf.random_normal_initializer()) # Create variable named "biases". biases = tf.get_variable("biases", bias_shape, initializer=tf.constant_initializer(0.0)) conv = tf.nn.conv2d(input, weights, strides=[1, 1, 1, 1], padding='SAME') return tf.nn.relu(conv + biases)

此函數(shù)使用短名稱 weights 和 biases,這有利于清晰區(qū)分二者。然而,在真實(shí)模型中,我們需要很多此類卷積層,而且重復(fù)調(diào)用此函數(shù)將不起作用:

input1 = tf.random_normal([1,10,10,32])input2 = tf.random_normal([1,20,20,32])x = conv_relu(input1, kernel_shape=[5, 5, 32, 32], bias_shape=[32])x = conv_relu(x, kernel_shape=[5, 5, 32, 32], bias_shape = [32]) # This fails.

由于期望的操作不清楚(創(chuàng)建新變量還是重新使用現(xiàn)有變量?),因此 TensorFlow 將會(huì)失敗。不過,在不同作用域內(nèi)調(diào)用 conv_relu 可表明我們想要?jiǎng)?chuàng)建新變量:

def my_image_filter(input_images): with tf.variable_scope("conv1"): # Variables created here will be named "conv1/weights", "conv1/biases". relu1 = conv_relu(input_images, [5, 5, 32, 32], [32]) with tf.variable_scope("conv2"): # Variables created here will be named "conv2/weights", "conv2/biases". return conv_relu(relu1, [5, 5, 32, 32], [32])

如果您想要共享變量,有兩種方法可供選擇。首先,您可以使用 reuse=True 創(chuàng)建具有相同名稱的作用域:

with tf.variable_scope("model"): output1 = my_image_filter(input1)with tf.variable_scope("model", reuse=True): output2 = my_image_filter(input2)

您也可以調(diào)用 scope.reuse_variables() 以觸發(fā)重用:

with tf.variable_scope("model") as scope: output1 = my_image_filter(input1) scope.reuse_variables() output2 = my_image_filter(input2)

由于依賴于作用域的確切字符串名稱可能比較危險(xiǎn),因此也可以根據(jù)另一作用域初始化某個(gè)變量作用域:

with tf.variable_scope("model") as scope: output1 = my_image_filter(input1)with tf.variable_scope(scope, reuse=True): output2 = my_image_filter(input2)

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    614

    瀏覽量

    28753
  • tensorflow
    +關(guān)注

    關(guān)注

    13

    文章

    330

    瀏覽量

    60935

原文標(biāo)題:TensorFlow 變量:表示程序處理的共享持久狀態(tài)的最佳方法

文章出處:【微信號(hào):tensorflowers,微信公眾號(hào):Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    HarmonyOS實(shí)踐之應(yīng)用狀態(tài)變量共享

    :運(yùn)行時(shí)存儲(chǔ),保存在內(nèi)存中,應(yīng)用范圍全局共享,提供統(tǒng)一的存儲(chǔ)供所有頁面訪問。 ○PersistentStorage :持久化存儲(chǔ),保存在硬盤上,在應(yīng)用退出或重啟后,數(shù)據(jù)依舊保留。 下面通過簡(jiǎn)單的程序示例
    發(fā)表于 12-27 09:48

    共享變量的使用

    讀到,這樣就產(chǎn)生錯(cuò)誤了!請(qǐng)問如何配置網(wǎng)絡(luò)或者共享變量的部署,使同樣的應(yīng)用程序可以在兩套設(shè)備上獨(dú)立運(yùn)行,而不是進(jìn)行網(wǎng)絡(luò)通信?(本問題給NI打過電話,NI的技術(shù)工程師也沒有好的方法,所以請(qǐng)
    發(fā)表于 11-07 19:24

    基于網(wǎng)絡(luò)共享變量的PC與PXI通信

    程序不可以調(diào)用pc端的共享變量(不能對(duì)其讀寫),而pc端的程序卻可以對(duì)部署在pxi端的共享變量
    發(fā)表于 06-28 15:35

    LabVIEW變量介紹——共享變量?

    變量又多了另一功能,就是支援網(wǎng)絡(luò)傳遞資料,如下圖所示,即為共享變量建立后的樣子。建立共享變量假設(shè)目前我在項(xiàng)目中已經(jīng)有兩個(gè)現(xiàn)成的VI,分別是E
    發(fā)表于 12-23 11:00

    為什么共享變量不能拖拽?

    添加了I/O,而且創(chuàng)建了綁定變量。但是想把共享變量拖拽到程序界面就是不行。
    發(fā)表于 08-15 08:55

    使用LabVIEW共享變量

    使用共享變量,您可以在同一個(gè)程序框圖的不同循環(huán)之間或者網(wǎng)絡(luò)上的不同VI之間共享數(shù)據(jù)。與LabVIEW中其他現(xiàn)有的數(shù)據(jù)共享
    發(fā)表于 02-19 08:55

    關(guān)于 TensorFlow

    out)的終點(diǎn),或者是讀取/寫入持久變量(persistent variable)的終點(diǎn)。“線”表示“節(jié)點(diǎn)”之間的輸入/輸出關(guān)系。這些數(shù)據(jù)“線”可以輸運(yùn)“size可動(dòng)態(tài)調(diào)整”的多維數(shù)據(jù)數(shù)組,即“張量
    發(fā)表于 03-30 19:57

    使用 TensorFlow, 你必須明白 TensorFlow

    shape. 想了解 TensorFlow 是如何處理這些概念的, 參見 Rank, Shape, 和 Type.變量Variables for more details. 變量維護(hù)
    發(fā)表于 03-30 20:03

    SYS/BIOS 多核 共享變量方法

    ? ? ? ? 最近在做SYS/BIOS多核相關(guān)的內(nèi)容,我是這樣規(guī)劃的,主核用來控制,從核用來接收數(shù)據(jù),兩個(gè)核之間有些變量共享,比如主核改變了一個(gè)變量,從核要根據(jù)改變的值來接收數(shù)據(jù)及相應(yīng)處理
    發(fā)表于 06-21 11:16

    情地使用Tensorflow吧!

    操作,但也可以表示數(shù)據(jù)輸入(feed in)的起點(diǎn)/輸出(push out)的終點(diǎn),或者是讀取/寫入持久變量(persistent variable)的終點(diǎn)?!熬€”表示“節(jié)點(diǎn)”之間的輸
    發(fā)表于 07-22 10:13

    TensorFlow常量、變量和占位符詳解

    = tf.train.Saver()TensorFlow 占位符介紹完常量和變量之后,我們來講解最重要的元素——占位符,它們用于將數(shù)據(jù)提供給計(jì)算圖。可以使用以下方法定義一個(gè)占位符
    發(fā)表于 07-22 16:12

    OpenHarmony持久化存儲(chǔ)UI狀態(tài):PersistentStorage

    AppStorage獲取和設(shè)置屬性的。 限制條件 持久化數(shù)據(jù)是一個(gè)相對(duì)緩慢的操作,應(yīng)用程序應(yīng)避免以下情況: ● 持久化大型數(shù)據(jù)集。 ● 持久化經(jīng)常變化的
    發(fā)表于 10-19 14:34

    實(shí)時(shí)任務(wù)處理程序設(shè)計(jì)中“易變的”變量

    實(shí)時(shí)任務(wù)處理程序設(shè)計(jì)中“易變的”變量
    發(fā)表于 05-15 13:52 ?7次下載

    Harmony 鴻蒙應(yīng)用級(jí)變量狀態(tài)管理

    應(yīng)用級(jí)變量狀態(tài)管理 在前面的章節(jié)中,已經(jīng)講述了如何管理頁面級(jí)變量狀態(tài),本章將說明如何管理應(yīng)用級(jí)變量
    的頭像 發(fā)表于 01-24 21:30 ?677次閱讀
    Harmony 鴻蒙應(yīng)用級(jí)<b class='flag-5'>變量</b>的<b class='flag-5'>狀態(tài)</b>管理

    TensorFlow的定義和使用方法

    數(shù)據(jù)流圖,從而簡(jiǎn)化機(jī)器學(xué)習(xí)模型的構(gòu)建、訓(xùn)練和部署。自2015年11月開源以來,TensorFlow迅速成為數(shù)據(jù)科學(xué)家、軟件開發(fā)者以及教育工作者廣泛使用的工具,廣泛應(yīng)用于圖像識(shí)別、自然語言處理、推薦系統(tǒng)等多個(gè)領(lǐng)域。本文將深入解讀Tenso
    的頭像 發(fā)表于 07-02 14:14 ?1212次閱讀