Skip to main content
 首页 » 编程设计

python之在多线程上进行预测时出现 Keras 错误

2024年09月07日33zhengyun_ustc

我正在尝试创建四个线程(每个线程都有自己的图形和模型),它们将同时运行并以相同的方式发出预测。

我的线程代码是这样的:

        thread_locker.acquire() 
        thread_graph = Graph() 
        with thread_graph.as_default(): 
            thread_session = Session() 
            with thread_session.as_default(): 
                #Model Training 
                if (once_flag_raised == False): 
                    try: 
                        model = load_model('ten_step_forward_'+ timeframe +'.h5') 
                    except OSError: 
                        input_layer = Input(shape=(X_train.shape[1], 17,)) 
 
                        lstm = Bidirectional( 
                            LSTM(250), 
                            merge_mode='concat')(input_layer) 
 
                        pred = Dense(10)(lstm) 
                        model = Model(inputs=input_layer, outputs=pred) 
                        model.compile(optimizer='adam', loss='mean_squared_error') 
                    once_flag_raised = True 
 
                model.fit(X_train, y_train, epochs=10, batch_size=128) 
                thread_locker.acquire() 
                nn_info_dict['model'] = model 
                nn_info_dict['sc'] = sc 
                model.save('ten_step_forward_'+ timeframe +'.h5') 
                thread_locker.release() 
        thread_locker.release() 
 
        (....) 
            thread_locker.acquire() 
            thread_graph = Graph() 
            with thread_graph.as_default(): 
                thread_session = Session() 
                with thread_session.as_default(): 
                    pred_data= model.predict(X_pred) 
            thread_locker.release() 

在每个线程上。

当我阅读代码的预测部分时,我不断收到以下错误(线程 - 1 次):

ValueError: Tensor Tensor("dense_1/BiasAdd:0", shape=(?, 10), dtype=float32) is not an element of this graph. 

我的理解是其中一个线程“声明”了 Tensorflow 后端及其默认图形和 session 。

有什么办法可以解决这个问题吗?

请您参考如下方法:

我已经知道我做错了什么了。 我的想法是正确的,但我不应该重新创建下面的图表和 session 。 代码的底部应该只是:

    thread_locker.acquire() 
    with thread_graph.as_default(): 
        with thread_session.as_default(): 
            pred_data= model.predict(X_pred) 
    thread_locker.release()