第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Tensorflow 中到底應該如何完成張量掩碼和索引?

在 Tensorflow 中到底應該如何完成張量掩碼和索引?

慕尼黑的夜晚無繁華 2023-06-27 17:27:10
我已經(jīng)使用 TF 兩年了,在每個項目中,我都會彈出許多無意義的錯誤來進行屏蔽,這些錯誤通常沒有幫助,并且不能表明實際問題是什么。或者更糟糕的是,結果是錯誤的,但沒有錯誤。我總是使用虛擬數(shù)據(jù)在訓練循環(huán)之外測試代碼,這很好。但在訓練中(調(diào)用 fit),我不明白 TensorFlow 到底期望什么。僅舉一個例子,有經(jīng)驗的人可以告訴我為什么這段代碼不適用于二進制交叉熵,結果是錯誤的并且模型不收斂,但在這種情況下沒有錯誤:class MaskedBXE(tf.keras.losses.Loss):    def __init__(self, **kwargs):        super().__init__(**kwargs)    def call(self, y_true, y_pred):        y_true = tf.squeeze(y_true)        mask = tf.where(y_true!=2)        y_true = tf.gather_nd(y_true, mask)        y_pred = tf.gather_nd(y_pred, mask)        loss = tf.keras.losses.binary_crossentropy(y_true, y_pred)        return tf.reduce_mean(loss)雖然這可以正常工作:class MaskedBXE(tf.keras.losses.Loss):    def __init__(self, **kwargs):        super().__init__(**kwargs)    def call(self, y_true, y_pred):        mask = tf.where(y_true!=2, True, False)        y_true = y_true[mask]        y_pred = y_pred[mask]        loss = tf.keras.losses.binary_crossentropy(y_true, y_pred)        return tf.reduce_mean(loss)對于一個絕對的例子來說,情況恰恰相反。我無法使用掩碼作為索引,如 y_pred[mask] 或 y_pred[mask[0]],或使用 tf.squeeze() 等。但使用 tf.gather_nd() 是有效的。我總是嘗試所有我認為可能的組合,我只是不明白為什么如此簡單的事情會如此困難和痛苦。Pytorch也是這樣嗎?如果您知道 Pytorch 沒有類似的煩人細節(jié),我很樂意切換。編輯 1:它們在訓練循環(huán)之外正常工作,或者更準確地說是圖形模式。y_pred = tf.random.uniform(shape=[10,], minval=0, maxval=1, dtype='float32')y_true = tf.random.uniform(shape=[10,], minval=0, maxval=2, dtype='int32')# first methodclass MaskedBXE(tf.keras.losses.Loss):    def __init__(self, **kwargs):        super().__init__(**kwargs)            def call(self, y_true, y_pred):        y_true = tf.squeeze(y_true)        mask = tf.where(y_true!=2)        y_true = tf.gather_nd(y_true, mask)        y_pred = tf.gather_nd(y_pred, mask)        loss = tf.keras.losses.binary_crossentropy(y_true, y_pred)        return tf.reduce_mean(loss)    def get_config(self):        base_config = super().get_config()        return {**base_config}# instantiatembxe = MaskedBXE()print(f'first snippet: {mbxe(y_true, y_pred).numpy()}')
查看完整描述

1 回答

?
萬千封印

TA貢獻1891條經(jīng)驗 獲得超3個贊

我認為問題在于您在第一個版本中無意中進行了廣播操作,這給您帶來了錯誤的結果。如果您的批次(?, 1)由于tf.squeeze操作而具有 shape ,則會發(fā)生這種情況。注意本例中的形狀


import tensorflow as tf


# Make random y_true and y_pred with shape (10, 1)

tf.random.set_seed(10)

y_true = tf.dtypes.cast(tf.random.uniform((10, 1), 0, 3, dtype=tf.int32), tf.float32)

y_pred = tf.random.uniform((10, 1), 0, 1, dtype=tf.float32)


# first

y_t = tf.squeeze(y_true)

mask = tf.where(y_t != 2)

y_t = tf.gather_nd(y_t, mask)

tf.print(tf.shape(y_t))

# [7]

y_p = tf.gather_nd(y_pred, mask)

tf.print(tf.shape(y_p))

# [7 1]

loss = tf.keras.losses.binary_crossentropy(y_t, y_p)

first_loss =  tf.reduce_mean(loss)

tf.print(tf.shape(loss), summarize=-1)

# [7]

tf.print(first_loss, summarize=-1)

# 0.884061277


# second

mask = tf.where(y_true!=2, True, False)

y_t = y_true[mask]

tf.print(tf.shape(y_t))

# [7]

y_p = y_pred[mask]

tf.print(tf.shape(y_p))

# [7]

loss = tf.keras.losses.binary_crossentropy(y_t, y_p)

tf.print(tf.shape(loss), summarize=-1)

# []

second_loss = tf.reduce_mean(loss)

tf.print(second_loss, summarize=-1)

# 1.15896356

在第一個版本中, 和y_t都y_p被廣播到 7x7 張量中,因此交叉熵基本上是“全部對全部”計算的,然后求平均值。在第二種情況下,僅計算每對對應值的交叉熵,這是正確的做法。


如果您只是刪除tf.squeeze上面示例中的操作,結果就會得到糾正。


查看完整回答
反對 回復 2023-06-27
  • 1 回答
  • 0 關注
  • 127 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號