我对如何在不使用解码二进制文件和 TensorFlow Serving 的情况下对 tensor2tensor 模型进行推理感到有些困惑。以下两个代码示例似乎最接近它,但我收到“无法转换符号张量”错误。
模型输出在它通过解码器并抛出错误之前给了我这个:
<tf.Tensor 'transformer/strided_slice:0' shape=(?, ?) dtype=int32>
https://gist.github.com/alexwolf22/7b24636c99a6f56da13c27a1ce573b8a#file-using_t2t_models-py https://gist.github.com/alexwolf22/e0ae60d8908c2772f2d3aedacf0ea618#file-decode_t2t_funcs-py
我可能做错了什么?有没有更好的例子来说明如何只用代码在 tensor2tensor 中进行推理?我也通过了 tensor2tensor 存储库中的解码.py,但仍然没有运气。这是我与推理代码一起关注的博客。
import tensorflow as tf
import numpy as np
from tensor2tensor.utils.trainer_lib import create_hparams, registry
from tensor2tensor import problems
from tensor2tensor.layers import common_hparams
from tensor2tensor.models.transformer import Transformer
def encode(input_txt, encoders):
"""List of Strings to features dict, ready for inference"""
encoded_inputs = [encoders["inputs"].encode(x) + [1] for x in input_txt]
# pad each input so is they are the same length
biggest_seq = len(max(encoded_inputs, key=len))
for i, text_input in enumerate(encoded_inputs):
encoded_inputs[i] = text_input + [0 for x in range(biggest_seq - len(text_input))]
# Format Input Data For Model
batched_inputs = tf.reshape(encoded_inputs, [len(encoded_inputs), -1, 1])
return {"inputs": batched_inputs}
def decode(integers, encoders):
"""Decode list of ints to list of strings"""
# Turn to list to remove EOF mark
to_decode = list(np.squeeze(integers))
if isinstance(to_decode[0], np.ndarray):
to_decode = map(lambda x: list(np.squeeze(x)), to_decode)
else:
to_decode = [to_decode]
# remove <EOF> Tag before decoding
to_decode = map(lambda x: x[:x.index(1)], filter(lambda x: 1 in x, to_decode))
# Decode and return Translated text
return [encoders["inputs"].decode(np.squeeze(x)) for x in to_decode]
INPUT_TEXT_TO_TRANSLATE = 'Translate this sentence into French'
# Set Tensor2Tensor Arguments
MODEL_DIR_PATH = 'data'
MODEL = 'transformer'
HPARAMS = 'transformer_base'
T2T_PROBLEM = 'translate_enfr_wmt_small8k_rev'
hparams = create_hparams(HPARAMS, data_dir=MODEL_DIR_PATH, problem_name=T2T_PROBLEM)
# Make any changes to default Hparams for model architechture used during training
hparams.batch_size = 1024
hparams.hidden_size = 7*80
hparams.filter_size = 7*80*4
hparams.num_heads = 8
# Load model into Memory
T2T_MODEL = registry.model(MODEL)(hparams, tf.estimator.ModeKeys.PREDICT)
# Init T2T Token Encoder/ Decoders
DATA_ENCODERS = problems.problem(T2T_PROBLEM).feature_encoders(MODEL_DIR_PATH)
### START USING MODELS
encoded_inputs= encode(INPUT_TEXT_TO_TRANSLATE, DATA_ENCODERS)
model_output = T2T_MODEL.infer(encoded_inputs, beam_size=2)["outputs"]
translated_text_in_french = decode(model_output, DATA_ENCODERS)
print(translated_text_in_french)