修复AttributeError: MaskedLMOutput对象无view属性报错
问题报错
运行基于Bert的日文标点恢复模型评估流程时,触发如下属性错误:AttributeError: 'MaskedLMOutput' object has no attribute 'view'
错误触发位置为模型forward函数中,对BertForMaskedLM的输出直接调用.view()方法的代码行。
MaskedLMOutput 含义
MaskedLMOutput是Hugging Face Transformers库中,掩码语言模型类(比如你用到的BertForMaskedLM)前向传播返回的结构化结果对象,不是PyTorch原生张量,它内置多个属性存储不同维度的输出结果:
logits:模型最终输出的分类得分张量,形状为(批次大小, 序列长度, 词表大小),是下游任务需要取用的核心计算结果loss:传入标签参数时计算得到的掩码语言模型损失,未传标签时返回Nonehidden_states:可选返回项,模型各层的隐藏状态张量,需要初始化模型时设置output_hidden_states=True才会返回attentions:可选返回项,模型各层的注意力权重张量,需要初始化模型时设置output_attentions=True才会返回
由于该对象本身是结构体,没有张量专属的.view()形变方法,直接调用就会触发你遇到的报错。
修复方案
你代码中的问题是直接把MaskedLMOutput对象当成张量做形变,只需要在拿到Bert输出后,先取它的logits属性(这才是你需要的张量结果),再做后续操作即可。
修正后的forward函数代码如下:
def forward(self, input): # 取出结构化输出里的logits张量,而非直接使用MaskedLMOutput对象 x = self.bert(input).logits x = x.view(x.shape[0], -1) x = self.fc(self.dropout(self.bn(x))) return x
注:你代码中硬编码的
bert_vocab_size=32000和所用cl-tohoku/bert-base-japanese模型的词表大小匹配,修改上述一行代码即可正常运行评估流程。
内容的提问来源于stack exchange,提问作者ryrie23
相关产品推荐
相关产品推荐

