Tensorflow:模块必须在实例化的图形中应用



我正在尝试用Django提供通用句子编码器。

代码在开始时初始化为后台进程(通过使用 supervisor 等程序(,然后它使用 TCP 套接字与 Django 通信,并最终返回编码的句子。

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])))时收到以下错误:

运行时错误:模块必须在实例化的图形中应用 为。


我基本上是在尝试在 tensorflow 中预加载表(因为它需要相当多的时间(,但 tensorflow 不允许我使用预定义的会话。

我该如何解决这个问题?有没有办法预加载这些变量?

附言 我相信这个 Github 问题页面可能会解决我的问题,但我不确定如何实现它。

使用您创建的图形加载模型,并在会话中使用该图形。

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()

最新更新