[英]Unique identifiers for TensorFlow 2 tensors?
在調試 output 時,我需要能夠清楚地區分張量。 讓我用一個示例問題來說明這一點:
import tensorflow as tf
def loss(x):
return x**2
x = tf.Variable(5,dtype=float)
y = tf.Variable(x,dtype=float)
print("x:", x)
print("y:", y)
with tf.GradientTape() as tape1:
z1 = loss(x)
grad_z1 = tape1.gradient(z1, [x])
with tf.GradientTape() as tape2:
z2 = loss(y)
grad_z2 = tape2.gradient(z2, [x]) # Variable should be y here!
print("grad_z1:", grad_z1)
print("grad_z2:", grad_z2)
其中 output 是:
x: <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=5.0>
y: <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=5.0>
grad_z1: [<tf.Tensor: id=25, shape=(), dtype=float32, numpy=10.0>]
grad_z2: [None]
在這里,我試圖獲得一個簡單損失 function 相對於某些輸入變量的梯度。 在“z1”的情況下,該示例運行良好,因為存在從x
到z1
的圖形連接。 但是它在 z2 的情況下會中斷,因為從x
到z2
沒有圖形連接。 通過從x
的值初始化一個新變量y
,這個連接被“意外地”破壞了。 在這個例子中問題很明顯,但在我更復雜的實際代碼中,意外替換像這樣的變量更容易,從而破壞計算。 然后我不得不四處尋找,試圖找出我在哪里犯了這樣的錯誤。
如果我可以檢查張量並找出它們在哪里變成不同的對象,這個過程會容易得多。 例如,是否有某種獨特的 ID 屬性或我可以檢查的東西? 在上面的示例中,我無法判斷x
和y
實際上是與打印的 output 完全不同的變量。 它們看起來相同,但當然不是。
因此,我需要其他可以打印的東西來幫助追蹤x
意外被交換為y
的時間。 有沒有這樣的財產? 肯定有,但我找不到。 也許我可以打印對象的 memory 地址或其他東西,但我也不確定如何在 Python 中執行此操作。
好吧,似乎 Python 具有我想要的內置機制:( 訪問 Object Memory 地址):
id(object)
這可能足以解決我的問題。 雖然如果有一個更簡單的標識符可以查看,那么我想我更喜歡它而不是盯着這些看起來隨機的大數字。
我不知道它是否有幫助,但您可以在 TensorFlow 中命名您的張量和變量,請參閱 文檔。 所以在你的情況下,你會做這樣的事情:
x = tf.Variable(5,dtype=float, name='x')
y = tf.Variable(x,dtype=float, name='y')
如果這還不夠,例如,如果你的張量有相同的名稱,你可以使用這個:
import tensorflow.keras.backend as K
x = tf.Variable(5,dtype=float, name='x_' + str(K.get_uid('x')))
y = tf.Variable(x,dtype=float, name='x_' + str(K.get_uid('x')))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.