我正在执行一个简单的序列到序列转换器任务。我尝试了各种损失和指标,但没有一个有效。目前,在 model.compile() 中我正在使用这些:
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'],
代码的输入和final_layer输出是正确的(batch_size、output_seq_length、output_vocab_size):
Sample input shape (encoder input): (18, 20)
Sample input shape (decoder input): (18, 100)
Model output shape: (18, 100, 200)
tf.Tensor([ 18 100 200], shape=(3,), dtype=int32)
无论如何,我得到的错误是它需要单个值:
InvalidArgumentError: Can not squeeze dim[1], expected a dimension of 1, got 100
[[{{node metrics/accuracy/Squeeze}}]]
所有代码都可以在一个相对简单的游乐场中使用:
https://colab.research.google.com/drive/1tfk518PwmrJEapxIQlOuiLmiTSfxREk3?usp=sharing
但这里是一些核心代码(我已经尝试了所有指标和损失):
self.encoder_embedding = tf.keras.layers.Embedding(args.problem_vocab_size, args.dim)
self.encoder_ffn = tf.keras.Sequential([
tf.keras.layers.Dense(args.dim_ff, activation='relu'),
tf.keras.layers.Dense(args.dim)
])
self.decoder_embedding = tf.keras.layers.Embedding(args.solution_vocab_size, args.dim)
self.cross_attention = tf.keras.layers.MultiHeadAttention(num_heads=args.num_heads, key_dim=args.dim // args.num_heads)
self.decoder_ffn = tf.keras.Sequential([
tf.keras.layers.Dense(args.dim_ff, activation='relu'),
tf.keras.layers.Dense(args.dim)
])
self.final_layer = tf.keras.layers.Dense(args.solution_vocab_size)
model.compile(optimizer=tf.keras.optimizers.legacy.Adam(args.learning_rate),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=[tf.keras.metrics.sparse_categorical_accuracy],
run_eagerly=False)
model.fit(dataset, epochs=args.epochs, steps_per_epoch=args.num_batches)
找到了解决方案,但我仍然不知道为什么原来的方法不起作用。如果我使用稀疏_分类_交叉熵指标,它会起作用 - 尽管我相信这会使我的准确性作为 seq-to-seq 任务的指标不太相关。