簡體   English   中英

如何在急切的執行模式中重用tensorflow變量?

[英]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/Bmy_model/my_layer_1/B ,每個維度1,共有5個可訓練參數。 代碼自行運行,所以隨意玩它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM