【问题标题】:Python: memmap list of objects become 'None' type inside joblib parallelPython:对象的memmap列表在joblib并行中变为“无”类型
【发布时间】:2018-07-30 12:48:47
【问题描述】:

我正在做以下事情:

  1. 我有一个张量流 DNN 层列表。 nn.append(tf.layers.dense(...))
  2. 上述每个列表都附加到 np.memmap 对象列表中。 nnList[i] = nn
  3. 我可以访问 memmap 列表并检索张量。但是当尝试访问joblib.parallel 中的张量时,它会返回“无”类型的对象。但是,joblib.parallel 内部的 memmap 列表的长度是正确的。

我在下面附上了一个示例代码。

    import os
    import tempfile
    import numpy as np
    import tensorflow as tf
    from joblib import Parallel, delayed, load, dump

    tmpFolder = tempfile.mkdtemp()
    __nnFile = os.path.join(tmpFolder, 'nn.mmap')
    nnList = np.memmap(__nnFile, dtype=object, mode='w+', shape=(5))

    def main():
        for i in range(5):
            nn = []
            input = tf.placeholder(dtype=tf.float32, shape=(1, 8))
            nn.append(tf.layers.dense(inputs=input, units=8, activation=tf.sigmoid,  
                                        trainable=False))
            nn.append(tf.layers.dense(inputs=nn[0], units=2, activation=tf.sigmoid,  
                                        trainable=False))

            nnList[i] = nn

        print('nnList: ' + str(len(nnList)))
        for i in range(5):
            nn = nnList[i]
            print(nn)
            print(nn[-1])
            print('---------------------------  ' + str(i))

        with Parallel(n_jobs = -1) as parallel:
            parallel(delayed(func1)(i) for i in range(5))

    def func1(i):
        print('nnList: ' + str(len(nnList)))
        for x in range(5):
            nn = nnList[x]
            print(nn)
            print('---------------------------  ' + str(x))

    if __name__ == '__main__':
        main()

上面的代码给出了这个输出。注意数组的长度以及张量如何变成None

    nnList: 5
    [<tf.Tensor 'dense/Sigmoid:0' shape=(1, 8) dtype=float32>, <tf.Tensor 'dense_1/Sigmoid:0' shape=(1, 2) dtype=float32>]
    Tensor("dense_1/Sigmoid:0", shape=(1, 2), dtype=float32)
    ---------------------------  0
    [<tf.Tensor 'dense_2/Sigmoid:0' shape=(1, 8) dtype=float32>, <tf.Tensor 'dense_3/Sigmoid:0' shape=(1, 2) dtype=float32>]
    Tensor("dense_3/Sigmoid:0", shape=(1, 2), dtype=float32)
    ---------------------------  1
    [<tf.Tensor 'dense_4/Sigmoid:0' shape=(1, 8) dtype=float32>, <tf.Tensor 'dense_5/Sigmoid:0' shape=(1, 2) dtype=float32>]
    Tensor("dense_5/Sigmoid:0", shape=(1, 2), dtype=float32)
    ---------------------------  2
    [<tf.Tensor 'dense_6/Sigmoid:0' shape=(1, 8) dtype=float32>, <tf.Tensor 'dense_7/Sigmoid:0' shape=(1, 2) dtype=float32>]
    Tensor("dense_7/Sigmoid:0", shape=(1, 2), dtype=float32)
    ---------------------------  3
    [<tf.Tensor 'dense_8/Sigmoid:0' shape=(1, 8) dtype=float32>, <tf.Tensor 'dense_9/Sigmoid:0' shape=(1, 2) dtype=float32>]
    Tensor("dense_9/Sigmoid:0", shape=(1, 2), dtype=float32)
    ---------------------------  4
    nnList: 5
    None
    ---------------------------  0
    None
    ---------------------------  1
    None
    ---------------------------  2
    None
    ---------------------------  3
    None
    ---------------------------  4

如何访问joblib.parallel 中的张量?请帮忙。

【问题讨论】:

    标签: python-3.x tensorflow nonetype joblib numpy-memmap


    【解决方案1】:

    当时发现了问题。希望它对未来的人有所帮助。

    None 问题与张量无关。我以错误的方式使用了joblib.Parallel 函数。

    应该将变量传递给delayed,以便分叉进程可以访问(我怎么在文档中忽略了这一点!)。正确做法:

    with Parallel(n_jobs = -1) as parallel:
        parallel(delayed(func1)(i, WHATEVER_VARIABLE_I_WANT) for i in range(5))
    

    【讨论】:

      猜你喜欢
      • 2020-10-10
      • 2021-06-14
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多