У меня есть набор данных в виде объекта 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 внутри сеанса, и это все равно приводит к той же ошибке.
Оттуда я был очень смущен тем, как это сделать. У кого-нибудь есть идеи о том, что я пропустил? Заранее спасибо.