Python 有没有办法在tf.GradientTape中为多个输出层应用渐变?

Python 有没有办法在tf.GradientTape中为多个输出层应用渐变?,python,tensorflow,keras,Python,Tensorflow,Keras,我试图在两个输出模型上应用梯度,但结果表明,模型没有学习,损失也没有减少, 我需要你的支持 多谢各位 @功能 def序列步骤(inp、targ、intent、enc_隐藏): loss=0 意向损失=0 使用tf.GradientTape(persistent=True)作为磁带: enc_输出,enc_隐藏=编码器(inp,enc_隐藏) dec_hidden=enc_hidden dec_input=tf.expand_dims([target_lang.word_index['']]*批量

我试图在两个输出模型上应用梯度,但结果表明,模型没有学习,损失也没有减少, 我需要你的支持 多谢各位

@功能 def序列步骤(inp、targ、intent、enc_隐藏):

loss=0
意向损失=0
使用tf.GradientTape(persistent=True)作为磁带:
enc_输出,enc_隐藏=编码器(inp,enc_隐藏)
dec_hidden=enc_hidden
dec_input=tf.expand_dims([target_lang.word_index['']]*批量大小,1)
#教师强制-将目标作为下一个输入
对于范围内的t(1,目标形状[1]):
#将enc_输出传递到解码器
预测,dec_hidden,u=插槽解码器(dec_输入,dec_hidden,enc_输出)
intent\u pred,u=intent\u解码器(dec\u隐藏,enc\u输出)
损失+=损失函数(目标[:,t],预测)
意向损失=损失功能(意向,意向预测)
#使用教师强制
dec_input=tf.expand_dims(目标[:,t],1)
批次损失=(损失/整数(目标形状[1])+意图损失
意向\变量=编码器.可训练\变量+意向\解码器.可训练\变量
插槽\u变量=编码器.可训练的\u变量+插槽\u解码器.可训练的\u变量
intent\u梯度=磁带梯度(intent\u损耗,intent\u变量)
槽梯度=磁带梯度(损耗、槽梯度变量)
优化器。应用梯度(zip(意向梯度,意向变量))
优化器。应用梯度(zip(槽梯度,槽变量))
德尔磁带
退货批量损失+意向损失
loss = 0
intent_loss = 0

with tf.GradientTape(persistent= True) as tape:

    enc_output, enc_hidden = encoder(inp, enc_hidden)

    dec_hidden = enc_hidden




    dec_input = tf.expand_dims([targ_lang.word_index['<start>']] * BATCH_SIZE, 1)

    # Teacher forcing - feeding the target as the next input
    for t in range(1, targ.shape[1]):

        # passing enc_output to the decoder
        predictions, dec_hidden, _ =slot_decoder(dec_input, dec_hidden, enc_output)
        intent_pred, _ = intent_decoder(dec_hidden, enc_output)

        loss += loss_function(targ[:, t], predictions)
        intent_loss = loss_function(intent, intent_pred)

        # using teacher forcing
        dec_input = tf.expand_dims(targ[:, t], 1)

batch_loss = (loss / int(targ.shape[1])) + intent_loss

intent_variables = encoder.trainable_variables + intent_decoder.trainable_variables
slot_variables = encoder.trainable_variables + slot_decoder.trainable_variables

intent_gradients = tape.gradient(intent_loss, intent_variables)
slot_gradients = tape.gradient(loss, slot_variables)


optimizer.apply_gradients(zip(intent_gradients, intent_variables))
optimizer.apply_gradients(zip(slot_gradients, slot_variables))

del tape
return batch_loss + intent_loss