昨天我在获取词汇命名空间transformer_tags
的vocab_size
值时遇到了一个问题。当我在Model
初始化短语中使用它时,我发现这个命名空间没有定义。为了解决这个问题,我阅读了源代码的一部分。我发现操作_add_encoding_to_vocabulary_if_needed
在tokens_to_indices
中被调用,直到_train_epoch
开始。
这意味着我在词汇中定义的transformer_tags
命名空间只能在forward
过程中和之后使用。这导致了一个问题,即我无法定义一个线性层,将模型输出转换为vocab_size
logits。当然,我可以使用from_pretrained_transformer
构造函数来获取一个可以在初始化短语中使用的相同命名空间。如果这是计划好的,我想知道在PretrainedTransformerIndexer
中_add_encoding_to_vocabulary_if_needed
的用途是什么。为什么不在PretrainedTransformerIndexer
的初始化方法中调用_add_encoding_to_vocabulary_if_needed
,这样我们就可以从Model
的初始化短语中使用指定的命名空间?
期待您的回复~~ 谢谢
2条答案
按热度按时间o2gm4chl1#
@AkshitaB 这只是一种友好的提醒,确保你没有忘记这个问题😜。
x6h2sr282#
PretrainedTransformerIndexer
在其__init__
方法中无法看到词汇表。因此我们不能在那里添加它。原则上,它应该自动发现词汇表。这是在标准化词汇表成为标准做法之前的做法。但是在大数据集上发现词汇表需要很长时间,而且大多数时候已经不再有必要了,所以我们加入了这个技巧来简化词汇表发现的过程。
您是对的,由于这个技巧,您在
Model.__init__()
中看不到整个词汇表。通常,我们将转换器模型的名称传递给Model.__init__()
,以便它从那里获取所需的内容。但这并不是那么优雅。如果您有更好的方法,请随时提交 PR。我很乐意审阅!