Seq2Seq Transformer任务中TF Accuracy指标报错:期望单个值却获概率列表
解决Seq-to-Seq Transformer中的准确率指标报错问题
问题根源
你的模型输出是3D张量(batch_size, output_seq_length, output_vocab_size),但默认的sparse_categorical_accuracy指标是为单步分类任务(输出形状为(batch_size, vocab_size)或(batch_size, 1, vocab_size))设计的,它会默认尝试挤压第二个维度(序列长度维度)。而你的序列长度是100而非1,因此触发了Can not squeeze dim[1], expected a dimension of 1, got 100错误。
解决方案
修改准确率指标的配置,明确指定在**最后一个维度(词汇表维度)**计算准确率,避免挤压序列长度维度。具体做法是使用tf.keras.metrics.SparseCategoricalAccuracy并设置axis=-1参数。
修改后的代码
将model.compile中的metrics部分替换为:
model.compile( optimizer=tf.keras.optimizers.legacy.Adam(args.learning_rate), loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=[tf.keras.metrics.SparseCategoricalAccuracy(axis=-1, name='sequence_accuracy')], run_eagerly=False )
额外说明
- 损失函数
SparseCategoricalCrossentropy默认已在最后一个维度计算交叉熵,只要你的标签形状是(batch_size, output_seq_length)(每个时间步对应一个词汇索引的稀疏标签),就可以正常工作。 - 上述配置会计算每个样本在各时间步的准确率,并输出所有样本的平均结果,完全适配seq-to-seq任务的序列输出特性。
内容的提问来源于stack exchange,提问作者Breck Emert
相关产品推荐
相关产品推荐

