Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Keras预测一个过程会冻结_Python 3.x_Multithreading_Keras - Fatal编程技术网

Python 3.x Keras预测一个过程会冻结

Python 3.x Keras预测一个过程会冻结,python-3.x,multithreading,keras,Python 3.x,Multithreading,Keras,我试图创建一个服务器,在给定特定输入的情况下预测(回归),然而,当我创建一个共享的keras(带有tensorflow后端)文件以每次预加载和跳过加载模型(这将节省大约1.8秒),并且当我尝试从线程预测任何内容时,程序只是冻结(即使在我的测试中只有一个线程在访问它)。我知道张量不是为这个而设计的,但是因为它只是预测应该有一个解决方法。我尝试过使用_make_prediction_函数,但没有起作用 这是主要功能: keras_model = keras_model_for_threads() d

我试图创建一个服务器,在给定特定输入的情况下预测(回归),然而,当我创建一个共享的keras(带有tensorflow后端)文件以每次预加载和跳过加载模型(这将节省大约1.8秒),并且当我尝试从线程预测任何内容时,程序只是冻结(即使在我的测试中只有一个线程在访问它)。我知道张量不是为这个而设计的,但是因为它只是预测应该有一个解决方法。我尝试过使用_make_prediction_函数,但没有起作用

这是主要功能:

keras_model = keras_model_for_threads()
def thread_function(conn, addr, alive):
    print('Connected by', addr)
    start = time.time()
    sent = conn.recv(1024)
    x_pred = preproc(sent)
    conn.sendall(keras_model.predict_single(x_pred))
    conn.close()
import socket

HOST = ''
PORT = xxxxx
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1000)
print('Ready for listening')
while alive.get():
    conn, addr = s.accept()
    Process(target=thread_function, args=(conn, addr, alive)).start()
对于keras_模型:

class keras_model_for_threads():
    def __init__(self):
        self.model = load_model(model_path)
        self.model._make_predict_function()

    def predict_single(self, x_pred):        
        return self.model.predict(x_pred)

现在,如果我正常运行它,它会执行并返回一个预测,但通过线程函数的过程,它会冻结在self.model.predict上。

在进一步搜索之后,我找到了一个有效的答案,即让一个管理器来处理预测。这将原始keras代码更改为:

from multiprocessing.managers import BaseManager
from multiprocessing import Lock

class KerasModelForThreads():
    def __init__(self):
        self.lock = Lock()
        self.model = None

    def load_model(self):
        from keras.models import load_model
        self.model = load_model(model_path)

    def predict_single(self, x_pred):
        with self.lock:
            return (self.model.predict(x_pred) + self.const.offset)[0][0]

class KerasManager(BaseManager):
    pass

KerasManager.register('KerasModelForThreads', KerasModelForThreads)

以及

from keras_for_threads import KerasManager
keras_manager = KerasManager()
keras_manager.start()
keras_model = keras_manager.KerasModelForThreads()
keras_model.load_model()
def thread_function(conn, addr, alive):
    print('Connected by', addr)
    start = time.time()
    sent = conn.recv(1024)
    x_pred = preproc(sent)
    conn.sendall(keras_model.predict_single(x_pred))
    conn.close()
import socket

HOST = ''
PORT = xxxxx
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1000)
print('Ready for listening')
while alive.get():
    conn, addr = s.accept()
    Process(target=thread_function, args=(conn, addr, alive)).start()
这是我在这里找到的github项目的精简版本(没有烧瓶,只有keras部分):