Как сопоставить набор данных с функцией, которая содержит сеанс Tensorflow? - PullRequest
0 голосов
/ 27 апреля 2019

У меня есть набор данных в виде объекта Tensorflow DatasetV1Adapter.

<DatasetV1Adapter shapes: OrderedDict([(labels, (6,)), (snippets, ())]), types: OrderedDict([(labels, tf.int32), (snippets, tf.string)])>

# Example Output
OrderedDict([('labels', <tf.Tensor: id=37, shape=(6,), dtype=int32, numpy=array([0, 0, 0, 0, 0, 0], dtype=int32)>), ('snippets', <tf.Tensor: id=38, shape=(), dtype=string, numpy=b'explanationwhy the edits made under my username hardcore metallica fan were reverted they werent vandalisms just closure on some gas after i voted at new york dolls fac and please dont remove the template from the talk page since im retired now892053827'>)])

OrderedDict([('labels', <tf.Tensor: id=41, shape=(6,), dtype=int32, numpy=array([0, 0, 0, 0, 0, 0], dtype=int32)>), ('snippets', <tf.Tensor: id=42, shape=(), dtype=string, numpy=b'daww he matches this background colour im seemingly stuck with thanks  talk 2151 january 11 2016 utc'>)])

Как видите, он содержит объект OrderedDict с ключами labels и snippets. Последнее в основном имеет значение, потому что оно содержит строки текста, которые я хотел преобразовать в векторы, используя вложение предложений.

Для этого я решил использовать Universal Sentence Encoder (USE) от тензорного концентратора. Он в основном принимает список предложений в качестве входных данных и выводит вектор длиной 512 в качестве выходных данных. Стоит отметить, что тензор потока концентратора не может быть выполнен во время, если включено активное выполнение. Поэтому мы должны определить сеанс, чтобы иметь возможность использовать USE с тензорным концентратором.

Однако я хочу использовать map, предоставленный tenorflow. Но возникает вопрос: как мне определить функцию, в которой есть сеанс тензорного потока? И чтобы использовать эту функцию и отобразить ее в наборе данных, нужно ли определить другой сеанс тензорного потока?

Мой первый подход был сделать это на самом деле. В частности, путем определения функции, которая содержит сеанс тензорного потока. Затем запустите новый сеанс tenorflow и попытайтесь сопоставить функцию с этим набором данных в этом сеансе.

Обратите внимание, что я определил модель внедрения предложений USE вне сеанса.

# Sentence embedding model (USE)
embed = hub.Module("https://tfhub.dev/google/universal-sentence-encoder/2")

def to_vec(w):
    x = w['snippets']
    with tf.Session() as sess:
        vector = sess.run(embed(x))
    return vector

with tf.Session() as sess:
        sess.run([tf.global_variables_initializer(), tf.tables_initializer()])
        # try_data is the DatasetV1Adapter object
        sess.run(try_data.map(to_vec))

Но я получил эту ошибку в конце

RuntimeError: Module must be applied in the graph it was instantiated for.

В качестве альтернативы я попытался определить функцию внутри сеанса тензорного потока, например,

with tf.Session() as sess:
    sess.run([tf.global_variables_initializer(), tf.tables_initializer()])

    def to_vec(w):
        x = w['snippets']
        vector = sess.run(embed(x))
        return vector
    sess.run(try_data.map(to_vec))

Но это не сработало, и я все еще получил ту же ошибку. После некоторого поиска я наткнулся на этот пост и этот пост , в котором говорилось, что я должен определить tf.Graph и передать его в сеансе.

graph = tf.Graph()

with graph.as_default():
    with tf.Session(graph=graph) as sess:
        sess.run([tf.global_variables_initializer(), tf.tables_initializer()])
        def to_vec(w):
            x = w['snippets']
            vector = sess.run(embed(x))
            return vector

        sess.run(try_data.map(to_vec))

Тем не менее, я все еще получил ту же ошибку. Я также попытался определить USE внутри сеанса, и это все равно приводит к той же ошибке.

Оттуда я был очень смущен тем, как это сделать. У кого-нибудь есть идеи о том, что я пропустил? Заранее спасибо.

1 Ответ

0 голосов
/ 28 апреля 2019

Краткий ответ: нет.Tensorflow вызовет функцию, которую вы передаете Dataset.map в режиме графика (он вызывает функцию только один раз и использует полученный график для каждого примера, так что вам, вероятно, не придется беспокоиться о возможном запуске подготовительного процесса, связанного с концентратором (загрузка и т. Д.).) для каждого примера).

Я не слишком знаком с тензорным концентратором, но попробуйте следующее.

def map_fn(inputs):
    snippets = inputs['snippets']
    # you -may- be able to pull the line below outside of map_fn
    # it probably won't affect performance
    embed = hub.Module("https://tfhub.dev/google/universal-sentence-encoder/2")
    vector = embed(snippets)
    return vector


dataset = dataset.map(map_fn)
...