问题描述
我正在为使用英语->德语的翻译器开发 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 (将#修改为@)