python - 如何让 Tensorflow 计算损失函数的梯度?
问题描述
我正在为使用编码器/解码器模式的英语->德语翻译器开发 Tensorflow 模型。Encoder 和 Decoder 由通过 Encoder 的状态输出连接的子模型组成。这是顶级模型:
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) 张量,其中 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 中所期望的。 为了能够成功计算梯度,我缺少什么?
解决方案
推荐阅读
- python-2.6 - Python 2.6.6:将打印绑定到任何其他函数会导致“语法错误”
- c - C中的不可分割子集-Hackerrank解决方案
- javascript - 有没有办法在下载时显示正确的切换图例?
- java - 当参数位于查询的选择部分时休眠绑定参数
- c# - 未找到 System.Data.SqlClient.SqlConnection - 命名空间只有几个类
- javascript - 如何使用 react devtools 获取与 onClick 事件侦听器相关联的功能
- javascript - 如何在cheerio中获取div的childNodes?
- elasticsearch - 使用带有弹性搜索的聚合数据在 grafana 上创建图形
- c++ - 你为什么要 =delete 隐式删除的默认构造函数,这有什么意义?
- excel - 如何将多个条件应用于.Find?