我最近在 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
将两个嵌入合并到一个层中,使用它可以使问题消失。但由于我想使用其他形式的嵌入,例如用于图像处理的补丁嵌入,因此我无法使用这个组合层。
解决方案是,与常规的 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")