简体   繁体   English

如何从加载的 BERT tensorflow model 进行预测

[英]How to predict from loaded BERT tensorflow model

I was trying to make a prediction from a loaded tensorflow model.我试图从加载的 tensorflow model 进行预测。 Though I'm not sure if it's correct how I previously saved it, specifically I have doubts about code inside serving_input_fn() function (MAX_SEQ_LENGTH=128):虽然我不确定我之前保存它的方式是否正确,但我特别怀疑serving_input_fn() function (MAX_SEQ_LENGTH=128) 中的代码:

def serving_input_fn():   
    feature_spec = {   "input_ids" : tf.FixedLenFeature([None,MAX_SEQ_LENGTH], tf.int64),                
                     "input_mask" : tf.FixedLenFeature([None,MAX_SEQ_LENGTH], tf.int64),       
                   "segment_ids" : tf.FixedLenFeature([None,MAX_SEQ_LENGTH], tf.int64),       
                   "label_ids" :  tf.FixedLenFeature([None], tf.int64)    }   

    serialized_tf_example = tf.placeholder(dtype=tf.string,shape=[None],name='input_example_tensor')   
    receiver_tensors = {'example': serialized_tf_example}   
    features = tf.parse_example(serialized_tf_example, feature_spec) 

    return tf.estimator.export.ServingInputReceiver(features, receiver_tensors)  

estimator.export_saved_model('gs://bucket/trained_model', serving_input_receiver_fn=serving_input_fn)

When I try to predict from loaded model:当我尝试从加载的 model 进行预测时:

from tensorflow.contrib import predictor
predict_fn = predictor.from_saved_model(LOAD_PATH)
input_features_test = convert_examples_to_features( test_examples,label_list, MAX_SEQ_LENGTH, tokenizer)
predictions = predict_fn({'example':input_features_test[0]})

it returns this error:它返回此错误:

ValueError: Cannot feed value of shape () for Tensor 'input_example_tensor:0', which has shape '(?,)' ValueError:无法为张量“input_example_tensor:0”提供形状()的值,其形状为“(?,)”

How should I change serving_input_fn() method?我应该如何更改 serving_input_fn() 方法?

If you want to reproduce it: github_repo (you should download variables from here and put it in trained_model/1608370941/ folder)如果你想重现它: github_repo (你应该从这里下载变量并将它放在trained_model/1608370941/文件夹中)

This is the tutorial I followed to fine tuned BERT model on google cloud TPU. 是我在谷歌云 TPU 上微调 BERT model 所遵循的教程。

I saved the model using following serving_input_fn() function (found in this tutorial ):我使用以下serving_input_fn() function (在本教程中找到)保存了 model:

def serving_input_fn():
    label_ids = tf.placeholder(tf.int32, [None], name='label_ids')
    input_ids = tf.placeholder(tf.int32, [None, MAX_SEQ_LENGTH], name='input_ids')
    input_mask = tf.placeholder(tf.int32, [None, MAX_SEQ_LENGTH], name='input_mask')
    segment_ids = tf.placeholder(tf.int32, [None, MAX_SEQ_LENGTH], name='segment_ids')
    input_fn = tf.estimator.export.build_raw_serving_input_receiver_fn({
        'label_ids': label_ids,
        'input_ids': input_ids,
        'input_mask': input_mask,
        'segment_ids': segment_ids,
    })()
    return input_fn

Then I loaded it using the code mentioned below:然后我使用下面提到的代码加载它:

from tensorflow.contrib import predictor
predict_fn = predictor.from_saved_model(LOAD_PATH_GCP)

I converted input string to BERT model input features with following method:我使用以下方法将输入字符串转换为 BERT model 输入特征:

def convert_single_string_to_input_dict(example_string_prep, vocab_file_path, max_seq_length):
  
  #Inizialize BERT tokenizer
  tokenizer = tokenization.FullTokenizer(vocab_file_path, do_lower_case=True)
  token_a = tokenizer.tokenize(example_string_prep)

  tokens = []
  segments_ids = []
  segment_ids = []

  tokens.append("[CLS]")
  segment_ids.append(0)
  for token in token_a:
    tokens.append(token)
    segment_ids.append(0)

  tokens.append('[SEP]')
  segment_ids.append(0)
    
  input_ids = tokenizer.convert_tokens_to_ids(tokens)
  input_mask = [1] * len(input_ids)

  while len(input_ids) < max_seq_length:
    input_ids.append(0)
    input_mask.append(0)
    segment_ids.append(0)

  label_id = [0]
  padding = [0] * max_seq_length

  print(len(input_ids),len(input_mask),len(segment_ids),len(label_id))

  return {"input_ids":[input_ids,padding], "input_mask":[input_mask,padding], "segment_ids":[segment_ids,padding], "label_ids":label_id}

Finally I made a prediction using loaded model:最后,我使用加载的 model 进行了预测:

MAX_SEQ_LENGTH = 128
VOCAB_FILE_PATH = 'path/to/vocab'

example_features = convert_single_string_to_input_dict(example_string, VOCAB_FILE_PATH, MAX_SEQ_LENGTH)

prediction = predict_fn(example_features)['probabilities'][0]
prediction_dict = {'POS': round(prediction[1],4), 'NEG': round(prediction[0],4)}
pprint(f"prediction: {prediction_dict}")

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何使用张量流为 BERT SQuAD2.0 构建输入以使用已保存的模型进行预测 - How to build input to predict with saved model for BERT SQuAD2.0 with tensorflow 如何从 Tensorflow 检查点 (ckpt) 文件预测 BERT-base 句子中的掩码词? - How to predict masked word in a sentence in BERT-base from Tensorflow checkpoint (ckpt) files? 从 Tensorflow 使用 BERT model 时出错 - Error with using BERT model from Tensorflow 如何使用 BERT model 和 TensorflowLite 预测(分类)用户句子 - How to predict (classify) user sentence with BERT model and TensorflowLite 如何使用从 save_weights 保存的张量流模型加载和预测? - How to load and predict with a tensorflow model saved from save_weights? 如何使用 Bulkinferrer 从之前在 Tensorflow Extended (TFX) 中推送的模型中进行预测 - How to predict with Bulkinferrer from a previously pushed model in Tensorflow Extended (TFX) TensorFlow:如何从SavedModel进行预测? - TensorFlow: How to predict from a SavedModel? 如何使用经过训练的 Tensorflow 模型预测值 - How to predict values with a trained Tensorflow model 如何通过 Tensorflow 上的训练模型预测一些图像 - How to predict some images by trained model on Tensorflow 如何使用tensorflow的ncf模型进行预测? - How to use tensorflow's ncf model to predict?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM