首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ViT模型的变压器中,last_hidden_state不等于hidden_states[-1]

在ViT模型的变压器中,last_hidden_state不等于hidden_states[-1]
EN

Stack Overflow用户
提问于 2021-09-07 08:29:13
回答 1查看 223关注 0票数 1

当输入相同的图像时,在Google ViT模型中,output.last_hidden_state不等于输出.隐藏状态-1?我在伯特试过,结果是一样的。

ViTFeatureExtractor.from_pretrained('google/vit-base-patch16-224-in21k') = feature_extractor

代码语言:javascript
复制
model = ViTModel.from_pretrained('google/vit-base-patch16-224-in21k')
inputs = feature_extractor(images=[image], return_tensors="pt")
outputs = model(pixel_values=inputs['pixel_values'], output_hidden_states=True)

vec1 = outputs.hidden_states[-1][0, 0, :]
vec2 = outputs.last_hidden_state[0, 0, :]

在我看来,vec1应该和vec2一样。但事实是,它们一点也不一样。

EN

回答 1

Stack Overflow用户

发布于 2022-07-31 07:52:23

不同之处在于将分层规范应用于last_hidden_state。

以下是ViTModel前向方法最后15行的摘录。对于分配给sequence_output的last_hidden_state,分层规范应用于编码器的输出。

代码语言:javascript
复制
sequence_output = encoder_outputs[0]
sequence_output = self.layernorm(sequence_output)
pooled_output = self.pooler(sequence_output) if self.pooler is not None else None

if not return_dict:
    head_outputs = (sequence_output, pooled_output) if pooled_output is not None else (sequence_output,)
    return head_outputs + encoder_outputs[1:]

return BaseModelOutputWithPooling(
    last_hidden_state=sequence_output,
    pooler_output=pooled_output,
    hidden_states=encoder_outputs.hidden_states,
    attentions=encoder_outputs.attentions,
)

如果将分层范数应用于隐含状态-1,则可以确定得到了相同的值。请参考我在科拉布做的笔记本。拥抱面

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69084798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档