pytorch-transformers:AttributeError: ‘str‘ object has no attribute ‘shape‘

错误:

AttributeError: 'str' object has no attribute 'shape' 

"""使用bert-chinese预训练模型对中文文本进行编码"""
# 引入torch模型
import torch
# 引入torch模型中的神经网络模型
import torch.nn as nn

# 1. 通过torch.hub(pytorch中专注于迁移学的工具)获得谷歌已经训练好的和中文信息相关的bert-base-chinese模型
# 里面的参数是定好的
model = torch.hub.load('huggingface/pytorch-transformers', 'model', 'bert-base-chinese')

# 2. 导入对应的字符映射器, 它将把中文的每个字映射成一个数字
tokenizer = torch.hub.load('huggingface/pytorch-transformers', 'tokenizer', 'bert-base-chinese')


# 3.将中文文本映射成bert编码后的文本张量表示
def get_bert_encode_for_single(text):
    """
    description: 使用bert-chinese预训练模型对中文文本进行编码【将中文文本映射成bert编码后的文本张量表示】
    :param text: 要进行编码的文本
    :return: 使用bert编码后的文本张量表示
    """
    # 3.1 首先使用字符映射器对每个汉字进行映射,参数是传入的中文信息的文本。这样就将中文信息转化为了编码后的信息
    # [1:-1]的原因:这里需要注意, bert的tokenizer映射后会为结果前后添加开始和结束标记即101和102
    # 这对于多段文本的编码是有意义的, 但在我们这里没有意义, 因此使用[1:-1]对头和尾进行切片
    indexed_tokens = tokenizer.encode(text)[1:-1]
    # 3.2之后将列表结构转化为tensor张量【将编码后的信息放在torch.tensor中】
    tokens_tensor = torch.tensor([indexed_tokens])
    print(tokens_tensor)
    # 3.3 直接用模型跑出值而不去自动计算梯度【预测部分需要使得模型不自动求导】
    with torch.no_grad():
        # 3.4 调用模型获得隐层输出
        encoded_layers, _ = model(tokens_tensor)
    print(f"encoded_layers.shape={encoded_layers.shape}")

原因:

问题在于,自transformers的3.xx版本以来,返回type已发生变化。所以,我们明确地要求得到tensors张量的元组tuple 。

因此,我们可以在调用model()时传递额外的参数return_dict=False,以获得对应于最后一个隐藏状态的实际张量。

解决:

 encoded_layers, _ = model(tokens_tensor, return_dict=False)

参考:https://stackoverflow.com/questions/66524542/attributeerror-str-object-has-no-attribute-shape-while-encoding-tensor-usin

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值