Импорт предварительно обученных вложений в столбец Tensorflow's Embedding Feature - PullRequest
0 голосов
/ 08 октября 2019

У меня есть оценщик TF, который использует Feature Columns на своем входном слое. Одним из них является и EmbeddingColumn, который я инициализировал случайным образом (поведение по умолчанию).

Теперь я хотел бы предварительно обучить мои вложения в gensim и перенести полученные вложения в мою модель TF. embedding_column принимает аргумент инициализатора, который ожидает вызова, который может быть создан с использованием tf.contrib.framework.load_embedding_initializer.

Однако эта функция ожидает сохраненную контрольную точку TF, которой у меня нет,потому что я натренировал свои вложения в gensim.

Вопрос: как сохранить векторы слов gensim (которые являются массивами) в качестве тензора в формате контрольной точки TF, чтобы я мог использовать это для инициализации моего столбца встраивания

1 Ответ

0 голосов
/ 10 октября 2019

Разобрался! Это работало в Tensorflow 1.14.0.

Сначала нужно превратить векторы внедрения в tf.Variable. Затем используйте tf.train.Saver, чтобы сохранить его в контрольной точке.

import tensorflow as tf
import numpy as np


ckpt_name = 'gensim_embeddings'
vocab_file = 'vocab.txt'
tensor_name = 'embeddings_tensor'
vocab = ['A', 'B', 'C']
embedding_vectors = np.array([
    [1,2,3],
    [4,5,6],
    [7,8,9]
], dtype=np.float32)

embeddings = tf.Variable(initial_value=embedding_vectors)
init_op = tf.global_variables_initializer()
saver = tf.train.Saver({tensor_name: embeddings})
with tf.Session() as sess:
    sess.run(init_op)
    saver.save(sess, ckpt_name)

# writing vocab file
with open(vocab_file, 'w') as f:
    f.write('\n'.join(vocab))

Чтобы использовать эту контрольную точку для инициализации столбца функции встраивания:

cat = tf.feature_column.categorical_column_with_vocabulary_file(
    key='cat', vocabulary_file=vocab_file)

embedding_initializer = tf.contrib.framework.load_embedding_initializer(
    ckpt_path=ckpt_name,
    embedding_tensor_name='embeddings_tensor',
    new_vocab_size=3,
    embedding_dim=3,
    old_vocab_file=vocab_file,
    new_vocab_file=vocab_file
)

emb = tf.feature_column.embedding_column(cat, dimension=3, initializer=embedding_initializer, trainable=False)

И мы можем проверить, чтобы убедиться, что он имеетбыли правильно инициализированы:

def test_embedding(feature_column, sample):
    feature_layer = tf.keras.layers.DenseFeatures(feature_column)
    print(feature_layer(sample).numpy())

tf.enable_eager_execution()

sample = {'cat': tf.constant(['B', 'A'], dtype=tf.string)}

test_embedding(item_emb, sample)

Выход, как и ожидалось, будет:

[[4. 5. 6.]
 [1. 2. 3.]]

, которые являются вложениями для 'B' и 'A' соответственно.

...