亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

如何使用張量板檢測消失和爆炸梯度?

如何使用張量板檢測消失和爆炸梯度?

LEATH 2022-08-02 16:51:52
我有兩個“子問題”1)我如何用Tensorboard檢測消失或爆炸梯度,因為目前根據“擬合#31173的未棄用write_grads”中已棄用?write_grads=TrueTensorboard callback2)我想我可以根據張量板中分布和直方圖選項卡中的權重分布和直方圖來判斷我的模型是否因梯度消失而受到影響。我的問題是,我沒有可以比較的參照系。目前,我的偏見似乎是“移動的”,但我無法判斷我的內核權重(Conv2D層)是否“移動”/“變化”“足夠”。有人可以通過給出一個經驗法則來幫助我在Tensorboard中直觀地評估這一點嗎?也就是說,如果只有內核權重的底部25%百分位在移動,那就足夠好了/不夠好了嗎?或者,也許有人可以從張量板中發布兩個消失漸變與非消失漸變的參考圖像。以下是我的直方圖和分布,是否可以判斷我的模型是否遭受梯度消失的影響?(為簡潔起見,省略了一些圖層)提前致謝。
查看完整描述

1 回答

?
慕俠2389804

TA貢獻1719條經驗 獲得超6個贊

我目前正面臨同樣的問題,并使用Tensorboard以類似的方式處理了這個問題。


即使不推薦使用,您仍然可以通過子類化并在方法中手動計算梯度來管理網絡每一層的梯度。write_gradstf.keras.Modelgradient.Tapetrain_step


與此類似的東西對我有用


from tensorflow.keras import Model


class TrainWithCustomLogsModel(Model):


    def __init__(self, **kwargs):

        super(TrainWithCustomLogsModel, self).__init__(**kwargs)

        self.step = tf.Variable(0, dtype=tf.int64,trainable=False)


    def train_step(self, data):


        # Get batch images and labels

        x, y = data

        

        # Compute the batch loss

        with tf.GradientTape() as tape:

            p = self(x , training = True)

            loss = self.compiled_loss(y, p, regularization_losses=self.losses)

        

        # Compute gradients for each weight of the network. Note trainable_vars and gradients are list of tensors

        trainable_vars = self.trainable_variables

        gradients = tape.gradient(loss, trainable_vars)


        # Log gradients in Tensorboard

        self.step.assign_add(tf.constant(1, dtype=tf.int64))

        #tf.print(self.step)

        with train_summary_writer.as_default():

          for var, grad in zip(trainable_vars, gradients):

            name = var.name

            var, grad = tf.squeeze(var), tf.squeeze(grad)

            tf.summary.histogram(name, var, step = self.step)

            tf.summary.histogram('Gradients_'+name, grad, step = self.step)

    

        # Update model's weights

        self.optimizer.apply_gradients(zip(gradients, trainable_vars))

        del tape

        # Update metrics (includes the metric that tracks the loss)

        self.compiled_metrics.update_state(y, p)

        # Return a dict mapping metric names to current value

        return {m.name: m.result() for m in self.metrics}

然后,您應該能夠可視化訓練中任何訓練步驟的梯度分布,以及核值的分布。


此外,可能值得嘗試繪制規范隨時間分布圖,而不是單個值。


查看完整回答
反對 回復 2022-08-02
  • 1 回答
  • 0 關注
  • 201 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號