首页 > 解决方案 > 当子进程尝试从 python 脚本加载 keras 模型时父进程退出

问题描述

我正在开发一个使用 keras 模型作为分类器的应用程序。这本身就可以正常工作,但是当我尝试将这些数据传输到 js 脚本以用于前端/GUI 部分时,我遇到了问题。失败的代码片段如下:
JS

const sensor = spawn('python', ['../../scripts/realtime_test.py']);
let count = 0;

sensor.stdout.on('data', function(data) {
    // Parse int if it is a classification, if it isn't, it is a debugging message
    let val = parseInt(data);
    if(!isNaN(val)){
        temperatures.push(val)
    } else{
        val = String.fromCharCode.apply(null, data)
        temperatures.push(val)
    }         
    console.log(count + " " + temperatures[count++]);
});

Python

if __name__ == "__main__":
    openzen.set_log_level(openzen.ZenLogLevel.Off)

    # Make client
    error, client = openzen.make_client()
    if not error == openzen.ZenError.NoError:
        print("Error while initializing OpenZen library", flush=True, end='')
        sys.exit(1)

    # Scan, connect and syncronize sensors
    sensors_found = scan_for_sensors(client)
    #name, s, imu, b = connect_to_sensor(client, sensors_found[0])
    
    sensor_bank = Sensor_Bank()
    for sensor in sensors_found:
        name, s, imu = connect_to_sensor(client, sensor)
        sensor_bank.add_sensor(name, s, imu)
    #print(len(sensor_bank.sensor_arr))
    data_queue = Data_Queue(len(sensor_bank.sensor_arr))

    sync_sensors(client, sensor_bank)

    model = keras.models.load_model(f'model/models/ANN_model_{NUM_SENSORS}.h5') # FAILING HERE
    classify_thread = threading.Thread(target=classify, args=[model, data_queue], daemon=True)
    classify_thread.start()

    collect_data(client, data_queue, sensor_bank)

问题似乎是模型的加载。该过程只是退出而没有错误消息,直到我在 python 代码片段中标记为 FAILING 的行之前工作得很好。AFAIK keras.load 函数不会产生它自己的单独进程,所以我不怀疑多个进程冲突可能是罪魁祸首......关于为什么会发生这种情况的任何想法?

提前致谢!

标签: javascriptpythonkeras

解决方案


推荐阅读