使用 allennlp 配置根据 crf_tagger 中的词汇大小指定前馈大小

Specifiying feedforward size based on vocab size in crf_tagger using allennlp config

我正在将我的 allennlp 模型从 classes 迁移到配置,最后一个构造我遇到了问题。

我在我的 LSTM CRF 解码器中使用前馈投影层,即

vocab_size = vocab.get_vocab_size("tokens")

feedforward = FeedForward(
    input_dim=encoder.get_output_dim(), 
    num_layers=2,
    hidden_dims=[text_field_embedder.get_output_dim(), vocab_size],
    activations=[Activation.by_name(Activation.by_name("relu"),Activation.by_name("linear")(),],
    dropout=[0.15,0.15],
    )

model = CrfTagger(
    vocab=vocab, 
    text_field_embedder=text_field_embedder,
    encoder=encoder,
    feedforward=feedforward,
    )

我 运行 关注的问题是如何在 json 中表达最后一个隐藏的 dim 大小 (vocab_size),因为它取决于 [=12] 的运行时值=]?

看来我需要在 CrfTagger 中构造 FeedForward(这样我可以在运行时访问 vocab)或创建我自己的 FeedForward 派生 class。

我想知道是否有更简洁的方法,有没有办法为 FeedForward 注册一个构造函数(本质上是一个工厂函数)?

好问题!从我的探索(以及对团队中另一个人的调查)来看,目前似乎没有一种干净的方法可以直接从带有 output_dim = vocab_size 的配置文件中动态创建 feedforward。似乎最好的选择是创建一个 feedforward 子类,它是用 vocab_size.

懒惰构造的