簡體   English   中英

TensorFlow 2 張量的唯一標識符?

[英]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”的情況下,該示例運行良好,因為存在從xz1的圖形連接。 但是它在 z2 的情況下會中斷,因為從xz2沒有圖形連接。 通過從x的值初始化一個新變量y ,這個連接被“意外地”破壞了。 在這個例子中問題很明顯,但在我更復雜的實際代碼中,意外替換像這樣的變量更容易,從而破壞計算。 然后我不得不四處尋找,試圖找出我在哪里犯了這樣的錯誤。

如果我可以檢查張量並找出它們在哪里變成不同的對象,這個過程會容易得多。 例如,是否有某種獨特的 ID 屬性或我可以檢查的東西? 在上面的示例中,我無法判斷xy實際上是與打印的 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.

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