是否可以結合不同層的損失?假設我有一個有五層的模型。
第一個損失(無論它可能是什么)是從帶有一些標簽的第三層的輸出中計算出來的。
第二個損失(例如,您的典型交叉熵損失)是根據您的分類標簽的最后一層的輸出計算得出的。
代碼示例如下:
def get_intermediate_model(base_model, intermediate_layer):
model = tf.keras.Model(inputs=base_model.inputs, outputs=base_model.layers[intermediate_layer-1].output)
return model
def gradientCalculation(fullModel, inputData, intermediateLabels,labels):
intermediateModel = get_intermediate_model(fullModel,3)
with tf.GradientTape() as tape:
intermediateOutput = intermediateModel(inputData,training=True)
classifierOutput = fullModel(inputData,training=True)
intermediate_layer_loss = anyLossFunction(intermediateLabels,intermediateOutput)
classifier_loss = tf.keras.losses.CategoricalCrossentropy(classifierOutput,labels)
combinedFinalLoss = classifier_loss (0.2 * intermediate_layer_loss )
gradients = tape.gradient(combinedFinalLoss , fullModel.trainable_variables)
return gradients
正如你所看到的,梯度是從總損失中生成的,fullModel而不是從intermediateModel。
這種操作正確嗎?可以tf.GradientTape()跟蹤從中間層計算的損失并相應地計算梯度嗎?
還是我們只是增加了整個模型正在優化的更多損失?
(期望的結果是 fullModel 的前 3 層將接收 2 個梯度相加,第一個損失的一個梯度已通過系數(0.2)減少,第二個來自反向傳播的梯度,由于所有的交叉熵損失層。第 4 層和第 5 層僅接收來自交叉熵損失的梯度)
uj5u.com熱心網友回復:
在您的代碼tf.GradientTape()中確實跟蹤了幾個損失,并將相應地計算梯度。
您的代碼存在問題,因為相同的資料通過網路兩次:
intermediateOutput = intermediateModel(inputData,training=True)
classifierOutput = fullModel(inputData,training=True)
從計算的角度來看,這是錯誤的。
您可以定義一個輸出兩個張量的模型:
model = tf.keras.Model(inputs=base_model.inputs, outputs=[base_model.layers[intermediate_layer-1].output, base_model.output])
請注意,只有在多次tf.GradientTape(persistent=True)呼叫時才需要設定(例如在 GAN 中)。tape.gradient
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/511229.html
標籤:张量流深度学习坡度
