Как построить встраивание матрицы, дружественной к памяти, в тензорном обслуживании? - PullRequest
0 голосов
/ 11 сентября 2018

Я конвертирую модель keras в * .pb файл, но я обнаружил, что матрица внедрения просто содержит слово, встречающееся в данных (потому что для экономии памяти и ускорения инициализации матрицы внедрения).

И мне нужно загрузить всеСлово для производства, существует какой-либо метод, который может не только сэкономить использование памяти и сделать матрицу встраивания, содержащую все слова?

Это код вектора слова предварительной загрузки:

def assign_pretrained_word_embedding(vocabulary_index2word,vocab_size,word2vec_model_path,text_file=False):
    from gensim.models import KeyedVectors as word2vec# we put import here so that many people who do not use word2vec do not need to install this package. you can move import to the beginning of this file.
    print("using pre-trained word emebedding.started.word2vec_model_path:",word2vec_model_path)
    if not text_file:
        word2vec_model = word2vec.load(word2vec_model_path,mmap='r')
    else:
        word2vec_model = word2vec.load_word2vec_format(word2vec_model_path, binary=False
                                                       # , unicode_errors='ignore'
                                                       )
    word2vec_dict = {}
    for word, vector in zip(word2vec_model.vocab, word2vec_model.vectors):
        word2vec_dict[word] = vector
    word_embedding_2dlist = np.zeros([vocab_size, 300])  # create an empty word_embedding list.
    # word_embedding_2dlist[0] =   # assign empty for first word:'PAD'
    bound = np.sqrt(6.0) / np.sqrt(vocab_size)  # bound for random variables.
    count_exist = 0;
    count_not_exist = 0
    for i in range(2, vocab_size):  # loop each word. notice that the first two words are pad and unknown token

        word = vocabulary_index2word[i]  # get a word
        embedding = None
        try:
            embedding = word2vec_dict[word]  # try to get vector:it is an array.
        except Exception:
            embedding = None
            # if len(word) >1 and not word.isalnum():
            #     for
            #     try:

        if embedding is not None:  # the 'word' exist a embedding
            word_embedding_2dlist[i] = embedding;
            count_exist = count_exist + 1  # assign array to this word.
        else:  # no embedding for this word
            word_embedding_2dlist[i] = np.random.uniform(-bound, bound, 300);
            count_not_exist = count_not_exist + 1  # init a random value for the word.
    word_embedding_final = np.array(word_embedding_2dlist,dtype='float32')  # covert to 2d array.
    print([x for x in word_embedding_final if len(x)!=300])
    print("word. exists embedding:", count_exist, " ;word not exist embedding:", count_not_exist)
    print("using pre-trained word emebedding.ended...")
    return word_embedding_final
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...