如何让 Tensorflow 计算梯度 w.r.t.我的损失函数?

问题描述

我正在为使用英语->德语的翻译器开发 Tensorflow 模型 编码器/解码器模式。编码器和解码器由子模型组成 由编码器的状态输出连接。这是顶级模型:

class TranslationModel( tf.keras.Model ):
    
    def __init__( self,**kwargs ):
        super( TranslationModel,self ).__init__( **kwargs )
        self.encoder_model = EncoderNetworkModel()
        self.decoder_model = DecoderNetworkModel()
        
    def call( self,inputs ):
        english_embeddings,german_tokens = inputs
        _,hidden_state,cell_state = self.encoder_model( english_embeddings )
        decoder_results = self.decoder_model( 
            right_shift_token_batch( german_tokens ),hidden_state = hidden_state,cell_state = cell_state )
        return decoder_results

解码器对一个英文句子输入的输出一个 (S,W) Tensor, 其中 S 是句子中的单词数,W 是唯一的单词数 德语单词。

为了训练模型,我定义了一个损失函数一个梯度函数,如下所示:

loss_function = tf.keras.losses.SparseCategoricalCrossentropy( from_logits = True )

def loss( decoder_outputs,shifted_german_tokens ):
    loss_value = loss_function( shifted_german_tokens,decoder_outputs )
    return loss_value

def grad( model,inputs,outputs ):
    english_embeddings,german_tokens = inputs
    with tf.GradientTape() as tape:
        loss_value = loss( outputs,left_shift_token_batch( german_tokens ) )
    return loss_value,tape.gradient( loss_value,model.trainable_variables )

并在训练循环中使用损失和梯度值。这是我遇到的地方 出现以下错误消息的问题:

ValueError: No gradients provided for any variable: [
    'lstm_8/kernel:0','lstm_8/recurrent_kernel:0','lstm_8/bias:0','translation_model_2/decoder_network_model_3/embedding_3/embeddings:0','translation_model_2/decoder_network_model_3/lstm_9/kernel:0','translation_model_2/decoder_network_model_3/lstm_9/recurrent_kernel:0','translation_model_2/decoder_network_model_3/lstm_9/bias:0','translation_model_2/decoder_network_model_3/dense_3/kernel:0','translation_model_2/decoder_network_model_3/dense_3/bias:0'].

列出的变量是我在 TranslationModel 中所期望的。 我错过了什么 能够成功计算梯度?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)