Конвертировать модель BERT в TFLite - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть этот код для поисковой системы semanti c, созданной с использованием предварительно обученной модели bert. Я хочу преобразовать эту модель в tflite для ее развертывания в Google mlkit. Я хочу знать, как это преобразовать. Я хочу знать, возможно ли вообще преобразовать это в tflite. Это может быть потому, что он упоминается на официальном сайте tenorflow: https://www.tensorflow.org/lite/convert. Но я не знаю с чего начать

Код:


from sentence_transformers import SentenceTransformer

# Load the BERT model. Various models trained on Natural Language Inference (NLI) https://github.com/UKPLab/sentence-transformers/blob/master/docs/pretrained-models/nli-models.md and 
# Semantic Textual Similarity are available https://github.com/UKPLab/sentence-transformers/blob/master/docs/pretrained-models/sts-models.md

model = SentenceTransformer('bert-base-nli-mean-tokens')

# A corpus is a list with documents split by sentences.

sentences = ['Absence of sanity', 
             'Lack of saneness',
             'A man is eating food.',
             'A man is eating a piece of bread.',
             'The girl is carrying a baby.',
             'A man is riding a horse.',
             'A woman is playing violin.',
             'Two men pushed carts through the woods.',
             'A man is riding a white horse on an enclosed ground.',
             'A monkey is playing drums.',
             'A cheetah is running behind its prey.']

# Each sentence is encoded as a 1-D vector with 78 columns
sentence_embeddings = model.encode(sentences)

print('Sample BERT embedding vector - length', len(sentence_embeddings[0]))

print('Sample BERT embedding vector - note includes negative values', sentence_embeddings[0])

#@title Sematic Search Form

# code adapted from https://github.com/UKPLab/sentence-transformers/blob/master/examples/application_semantic_search.py

query = 'Nobody has sane thoughts' #@param {type: 'string'}

queries = [query]
query_embeddings = model.encode(queries)

# Find the closest 3 sentences of the corpus for each query sentence based on cosine similarity
number_top_matches = 3 #@param {type: "number"}

print("Semantic Search Results")

for query, query_embedding in zip(queries, query_embeddings):
    distances = scipy.spatial.distance.cdist([query_embedding], sentence_embeddings, "cosine")[0]

    results = zip(range(len(distances)), distances)
    results = sorted(results, key=lambda x: x[1])

    print("\n\n======================\n\n")
    print("Query:", query)
    print("\nTop 5 most similar sentences in corpus:")

    for idx, distance in results[0:number_top_matches]:
        print(sentences[idx].strip(), "(Cosine Score: %.4f)" % (1-distance))

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Вы пытались запустить инструмент конвертирования (tflite_convert) и он что-нибудь жаловался?

Кстати, вы можете попробовать пример QA от команды TFLite, которая использует модель Берта. https://github.com/tensorflow/examples/tree/master/lite/examples/bert_qa/android

0 голосов
/ 02 апреля 2020

Прежде всего, вам нужно иметь свою модель в TensorFlow, пакет, который вы используете, написан на PyTorch. Трансформаторы от Huggingface имеют модели TensorFlow, с которых вы можете начать. Кроме того, они также имеют модели с поддержкой TFLite для Android.

В общем, сначала у вас есть модель TensorFlow. Сохраните их в формате SavedModel:

tf.saved_model.save(pretrained_model, "/tmp/pretrained-bert/1/")

Вы можете запустить конвертер на этом.

...