Tensorflow: модуль должен быть применен в графе, для которого он был создан - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь обслужить универсальный кодировщик предложений с Джанго.

Код инициализируется вначале как фоновый процесс (с помощью таких программ, как супервизор), затем он связывается с Django с помощью сокетов TCP и в конечном итоге возвращает закодированное предложение.

import socket
from threading import Thread
import tensorflow as tf
import tensorflow_hub as hub
import atexit

# Pre-loading the variables:
embed = hub.Module("https://tfhub.dev/google/universal-sentence-encoder/2")
session = tf.Session()
session.run(tf.global_variables_initializer())
session.run(tf.tables_initializer())
atexit.register(session.close)  # session closes if the script is halted
...
# Converts string to vector embedding:
def initiate_connection(conn):
    data = conn.recv(1024)
    conn.send(session.run(embed([data])))
    conn.close()

# Process in background, waiting for TCP message from views.py
while True:
    conn, addr = _socket.accept()
    _thread = Thread(target=initiate_connection, args=(conn,))  # new thread for each request (could be limited to n threads later)
    _thread.demon = True
    _thread.start()
    conn.close()

НоЯ получаю следующую ошибку при выполнении conn.send(session.run(embed([data]))):

RuntimeError: Модуль должен быть применен к графу, для которого он был создан.


Я в основномпытается предварительно загрузить таблицу в tenorflow (потому что это занимает довольно много времени), но тензор потока не позволяет мне использовать заранее определенный сеанс.

Как я могу это исправить?Есть ли способ предварительно загрузить эти переменные?

PS Я считаю, эта страница проблемы Github может иметь решение для моей проблемы, но я не уверен, как это можно реализовать.

1 Ответ

0 голосов
/ 28 марта 2019

Загрузите вашу модель с созданным вами графиком и используйте его в своем сеансе.

graph = tf.Graph()
with tf.Session(graph = graph) as session:
     embed = hub.Module("https://tfhub.dev/google/universal-sentence-encoder/2")

И используйте тот же объект графика в функции initiate_connection с сеансом

def initiate_connection(conn):
    data = conn.recv(1024)
    with tf.Session(graph = graph) as session:
        session.run([tf.global_variables_initializer(), tf.tables_initializer()])
        conn.send(session.run(embed([data])))
    conn.close()
...