Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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
由于缺少信号量,当使用tensorflow时,Python、Chaquopy和Android都会出现问题_Python_Tensorflow_Keras_Chaquopy - Fatal编程技术网

由于缺少信号量,当使用tensorflow时,Python、Chaquopy和Android都会出现问题

由于缺少信号量,当使用tensorflow时,Python、Chaquopy和Android都会出现问题,python,tensorflow,keras,chaquopy,Python,Tensorflow,Keras,Chaquopy,我正在用Chaquopy在Android上运行tensorflow的keras。当我调用predict()时 在我的模型上,我得到一个异常,具有以下堆栈跟踪: AndroidRuntime: Process: com.example.android.camera2basic, PID: 10113 AndroidRuntime: com.chaquo.python.PyException: ImportError: This platform lacks a functioning sem_op

我正在用Chaquopy在Android上运行tensorflow的keras。当我调用predict()时 在我的模型上,我得到一个异常,具有以下堆栈跟踪:

AndroidRuntime: Process: com.example.android.camera2basic, PID: 10113
AndroidRuntime: com.chaquo.python.PyException: ImportError: This platform lacks a functioning sem_open implementation, therefore, the required synchronization primitives needed will not function, see issue 3770.
AndroidRuntime:     at <python>.multiprocessing.synchronize.<module>(synchronize.py:30)
AndroidRuntime:     at <python>.zipimport.load_module(<frozen zipimport>:259)
AndroidRuntime:     at <python>.java.chaquopy.import_override(import.pxi:60)
AndroidRuntime:     at <python>.multiprocessing.context.Lock(context.py:67)
AndroidRuntime:     at <python>.multiprocessing.queues.__init__(queues.py:336)
AndroidRuntime:     at <python>.multiprocessing.context.SimpleQueue(context.py:113)
AndroidRuntime:     at <python>.multiprocessing.pool.__init__(pool.py:196)
AndroidRuntime:     at <python>.multiprocessing.pool.__init__(pool.py:922)
AndroidRuntime:     at <python>.tensorflow.python.keras.engine.training_utils.get_copy_pool(training_utils.py:210)
AndroidRuntime:     at <python>.tensorflow.python.keras.engine.training_utils.__init__(training_utils.py:242)
AndroidRuntime:     at <python>.tensorflow.python.keras.engine.training_utils.create(training_utils.py:335)
AndroidRuntime:     at <python>.tensorflow.python.keras.engine.training_v2.run_one_epoch(training_v2.py:171)
AndroidRuntime:     at <python>.tensorflow.python.keras.engine.training_v2._model_iteration(training_v2.py:464)
AndroidRuntime:     at <python>.tensorflow.python.keras.engine.training_v2.predict(training_v2.py:495)
AndroidRuntime:     at <python>.tensorflow.python.keras.engine.training.predict(training.py:1004)
AndroidRuntime:Process:com.example.android.camera2base,PID:10113
AndroidRuntime:com.chaquo.python.PyException:ImportError:此平台缺少一个功能正常的sem_开放式实现,因此,所需的同步原语将无法正常工作,请参阅第3770期。
AndroidRuntime:at.multiprocessing.synchronize.(synchronize.py:30)
AndroidRuntime:at.zipimport.load_模块(:259)
AndroidRuntime:at.java.chaquopy.import\u覆盖(import.pxi:60)
AndroidRuntime:at.multiprocessing.context.Lock(context.py:67)
AndroidRuntime:at.multiprocessing.queues.\uuu init\uuu(queues.py:336)
AndroidRuntime:at.multiprocessing.context.SimpleQueue(context.py:113)
AndroidRuntime:at.multiprocessing.pool.\uuu init\uuu(pool.py:196)
AndroidRuntime:at.multiprocessing.pool.\uuu init\uuuu(pool.py:922)
AndroidRuntime:at.tensorflow.python.keras.engine.training_utils.get_copy_pool(training_utils.py:210)
AndroidRuntime:at.tensorflow.python.keras.engine.training_utils.uu_init_uu(training_utils.py:242)
AndroidRuntime:at.tensorflow.python.keras.engine.training_utils.create(training_utils.py:335)
AndroidRuntime:at.tensorflow.python.keras.engine.training_v2.run_one_epoch(training_v2.py:171)
AndroidRuntime:at.tensorflow.python.keras.engine.training\u v2.\u model\u迭代(training\u v2.py:464)
AndroidRuntime:at.tensorflow.python.keras.engine.training_v2.predict(training_v2.py:495)
AndroidRuntime:at.tensorflow.python.keras.engine.training.predict(training.py:1004)
我的理解是Android不支持信号量


有人对此有任何解决方法吗?

Keras实际上正在尝试使用一个简单的线程池,但看起来标准库无论如何都在引入一些进程间同步代码。我想这并没有被注意到,因为所有的主要平台都支持信号量

要解决此问题,请在使用Keras之前运行以下代码:

    import multiprocessing
    import threading
    def threading_func(name):
        def f(self, *args, **kwargs):
            return getattr(threading, name)(*args, **kwargs)
        f.__name__ = f.__qualname__ = name
        return f

    ctx = multiprocessing.get_context()
    for name in ["Lock", "RLock", "Condition", "Semaphore", "BoundedSemaphore",
                 "Event", "Barrier"]:
        setattr(type(ctx), name, threading_func(name))
        setattr(multiprocessing, name, getattr(ctx, name))

请在评论中告诉我这是否有效,因为我可能会将其合并到Chaquopy的下一个版本中。

Chaquopy版本7.0.3修复了此问题,因此该版本或更高版本不再需要此解决方法。