[英]How to reuse tensorflow variables in eager execution mode?
在tensorflow中調用get_variable()函數時,“reuse”標志的行為在tensorflow api doc中定義為AUTO_REUSE:
重用:True,None或tf.AUTO_REUSE; ... 當啟用eager執行時,此參數始終強制為tf.AUTO_REUSE 。
但是,當我真正按照網頁中的建議運行演示代碼時:
tf.enable_eager_execution()
def foo():
with tf.variable_scope("foo", reuse=tf.AUTO_REUSE):
v = tf.get_variable("v", [1])
return v
v1 = foo() # Creates v.
v2 = foo() # Gets the same, existing v.
assert v1 == v2
它失敗。 (如果第一行被刪除,它會通過,如預期的那樣。)
那么如何在急切模式下重用變量呢? 這是一個錯誤還是我錯過了什么?
在急切的模式下,事情變得更簡單......除了那些因為使用圖形模型太長時間而受到腦損傷的人(比如我)。
Eager以標准方式工作,其中變量僅在引用時才持續。 如果你停止引用它們,它們就會消失。
要進行變量共享,如果你要使用numpy(或其他任何東西)進行計算,你會自然地做同樣的事情:將變量存儲在一個對象中,然后重用這個對象。
這就是為什么渴望與keras API有如此多的親和力的原因,因為keras主要處理對象。
所以再看一下你的函數就numpy而言(對於像我這樣從圖中恢復的人來說很有用)。 你期望兩次調用foo
返回相同的數組對象嗎? 當然不是。
tensorflow / python / ops / variable_scope.py中的文檔現在似乎已更新。
從310行 :
“reuse:a Boolean,None或tf.AUTO_REUSE。控制重用或創建變量。當啟用eager執行時,此參數始終強制為False。”
從第2107行 :
“當啟用eager執行時,除非EagerVariableStore或模板當前處於活動狀態,否則始終會創建新變量。”
通過簡單地將引用傳遞給同一個變量,我發現在Eager Execution中重用變量是最容易的:
import tensorflow as tf
tf.enable_eager_execution()
import numpy as np
class MyLayer(tf.keras.layers.Layer):
def __init__(self):
super(MyLayer, self).__init__()
def build(self, input_shape):
# bias specific for each layer
self.B = self.add_variable('B', [1])
def call(self, input, A):
# some function involving input, common weights, and layer-specific bias
return tf.matmul(input, A) + self.B
class MyModel(tf.keras.Model):
def __init__(self):
super(MyModel, self).__init__()
def build(self, input_shape):
# common vector of weights
self.A = self.add_variable('A', [int(input_shape[-1]), 1])
# layers which will share A
self.layer1 = MyLayer()
self.layer2 = MyLayer()
def call(self, input):
result1 = self.layer1(input, self.A)
result2 = self.layer2(input, self.A)
return result1 + result2
if __name__ == "__main__":
data = np.random.normal(size=(1000, 3))
model = MyModel()
predictions = model(data)
print('\n\n')
model.summary()
print('\n\n')
print([v.name for v in model.trainable_variables])
輸出是:
因此,我們有一個共同的權重參數my_model/A
的維度3和兩個偏差參數my_model/my_layer/B
和my_model/my_layer_1/B
,每個維度1,共有5個可訓練參數。 代碼自行運行,所以隨意玩它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.