警告:变量不存在梯度

问题描述 投票:0回答:1

我最近在 Tensorflow 中遇到了一个警告,这让我有些头疼,并且花了一段时间才修复。由于网上没有找到解决方案,所以想分享一下。

我正在构建一个变压器(编码器-解码器)架构。但我的训练成绩确实很差。无论输入如何,变压器总是给出相同的答案,尽管训练精度看起来非常好(高于 0.95)。最重要的是,我收到此警告:

WARNING:tensorflow:Gradients do not exist for variables ['embedding/embeddings:0'] when minimizing the loss. If you're using 'model.compile()', did you forget to provide a 'loss' argument?

编码器和解码器都有

  • 通过
    keras.Embedding
    层实现的令牌嵌入
  • 位置嵌入,通过
    keras_nlp.PositionEmbedding
    层。

这是编码器代码:

encoder_inputs = Input(shape=(encoder_inputs_size,), name="encoder_inputs")
token_embeddings = Embedding(input_dim=vocabulary_size, output_dim=embedding_dim)   (encoder_inputs)
position_embeddings = PositionEmbedding(sequence_length=encoder_inputs_size)(token_embeddings)
encoder_outputs = TransformerEncoder(intermediate_dim=intermediate_dim, num_heads=num_heads)(inputs=position_embeddings)
encoder = Model(encoder_inputs, encoder_outputs, name="encoder")

keras_nlp.TokenAndPositionEmbedding
将两个嵌入合并到一个层中,使用它可以使问题消失。但由于我想使用其他形式的嵌入,例如用于图像处理的补丁嵌入,因此我无法使用这个组合层。

python tensorflow keras transformer-model
1个回答
0
投票

解决方案是,与常规的 keras 层在连接时简单地传递信息不同,令牌嵌入和位置嵌入必须手动添加,因此以下代码修复了问题:

encoder_inputs = Input(shape=(encoder_inputs_size,), name="encoder_inputs")
token_embeddings = Embedding(input_dim=vocabulary_size, output_dim=embedding_dim)(encoder_inputs)
position_embeddings = PositionEmbedding(sequence_length=encoder_inputs_size)(token_embeddings)

# this line adds up the embeddings and fixes the problem
embeddings = token_embeddings + position_embeddings

encoder_outputs = TransformerEncoder(intermediate_dim=intermediate_dim, num_heads=num_heads)(inputs=embeddings)
encoder = Model(encoder_inputs, encoder_outputs, name="encoder")
© www.soinside.com 2019 - 2024. All rights reserved.