transformers中TFBert等模型加载问题(two structures don‘t have the same nested structure)

如果将transformers中的tfbert等模型嵌入到自己的模型中,在保存与加载的时候可能会出现以下问题:

ValueError: The two structures don’t have the same nested structure.

First structure: type=dict str={‘input_ids’: TensorSpec(shape=(None, 5), dtype=tf.int32, name=‘input_ids/input_ids’)}

Second structure: type=dict str={‘token_type_ids’: TensorSpec(shape=(None, 128), dtype=tf.int64, name=‘input_ids/token_type_ids’), ‘attention_mask’: TensorSpec(shape=(None, 128), dtype=tf.int64, name=‘input_ids/attention_mask’), ‘input_ids’: TensorSpec(shape=(None, 128), dtype=tf.int64, name=‘input_ids/input_ids’)}

问题说明:
如果是直接使用bert(inputs) 调用,保存模型再加载就会出现上述问题

原因:
call() 函数没有添加@tf.function(signatures)注解,也就是没有定义输入数据格式, 如果直接保存模型恢复的时候没办法恢复输入数据的定义

解决办法:
使用model.serving()函数
在这里插入图片描述
可以看出源码是实现了输入数据格式定义的,这样修改之后就咩有加载方面的问题了

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以通过以下步骤来实现: 1. 安装必要的依赖项:`pip install transformers pyspark` 2. 在Spark创建一个`SparkSession`: ```python from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("BertExample") \ .getOrCreate() ``` 3. 加载BERT模型: ```python from transformers import BertTokenizer, TFBertModel tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') model = TFBertModel.from_pretrained('bert-base-chinese') ``` 4. 定义一个UDF(用户定义的函数)来对数据进行处理: ```python import tensorflow as tf @tf.function def bert_encode(texts, tokenizer, max_len=512): input_ids = [] attention_masks = [] for text in texts: encoded = tokenizer.encode_plus( text, add_special_tokens=True, max_length=max_len, pad_to_max_length=True, return_attention_mask=True ) input_ids.append(encoded['input_ids']) attention_masks.append(encoded['attention_mask']) return tf.convert_to_tensor(input_ids), tf.convert_to_tensor(attention_masks) def encode_text(df, input_col, output_col): texts = df.select(input_col).rdd.flatMap(lambda x: x).collect() input_ids, attention_masks = bert_encode(texts, tokenizer) df = df.withColumn(output_col + '_input_ids', F.lit(input_ids)) df = df.withColumn(output_col + '_attention_masks', F.lit(attention_masks)) return df ``` 5. 在Spark读取数据,然后将其传递给`encode_text`函数进行处理: ```python from pyspark.sql.functions import col from pyspark.ml.feature import VectorAssembler df = spark.read.csv('path/to/data.csv', header=True, inferSchema=True) df = df.select(col('input_text')) df = encode_text(df, 'input_text', 'bert') vectorAssembler = VectorAssembler(inputCols=['bert_input_ids', 'bert_attention_masks'], outputCol='bert_features') df = vectorAssembler.transform(df) df.show() ``` 这将创建一个包含BERT功能的新数据框。你可以使用该数据框来训练模型或进行其他操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值