2

もともと Shogun Machine Learning ツールボックスを使用していた機械学習コードを (簡単な方法で) 並列化しようとしています。トレーニングには多くの構成が考えられるため、順次処理は適切なアプローチではありません。という名前の学習マシン オブジェクトがあり、そのパラメーターは、私がプログラムした という名前のパス ジェネレーターによって生成されたグリッド パラメーターリスト ( )mkl_objectに従って更新されます。各パスのモデルを学習するようなマルチプロセッシング設定が必要です。つまり、たとえば、3 つのパスのリストに対応する 3 つのモデル:は、それぞれ別のコアで 3 つのモデルを学習します。以下のコードとその誤った出力を参照してください。pathpathsgridObj.generateRandomGridPaths()mkl_objectpaths = [[('wave', [0.5, 100]), '2-gr', 7, 'weibull', 1.0, 0.4], [('spherical', [0.5, 50]), '2-gr_tfidf', 26, 'linear', 5.0, 20.0], [('exponential', [0.5, 50]), '3-gr_tfidf', 22, 'triangular', 1.5, 1.3]]

from multiprocessing import Pool
#from functools import partial # I already tried with partial and parmap
#import parmap as par
# My Machine learning and random grid search modules:
from mklObj import *
from gridObj import *
# The input training and test data subsets are ShogunFeature objects
[feats_train,
feats_test,
labelsTr,
labelsTs] = load_multiclassToy('../shogun-data/toy/',# Directory
         'train_multiclass.dat',# Sample dataSet file name
         'label_multiclass.dat')# Multi-class Labels file name

mkl_object = mklObj() # Learning machine global instantiation
#Function for mapping:    
def mkPool(path): # path: a list of learning parameters
    global feats_train # Train and test data produced above
    global labelsTr
    global feats_test
    global labelsTs

    global mkl_object 

    if path[0][0] is 'gaussian':
        a = 2*path[0][1][0]**2
        b = 2*path[0][1][1]**2
    else:
        a = path[0][1][0]
        b = path[0][1][1]
    # Setting each listelement (paths[i]) as learning parameter:
    mkl_object.mklC = path[5]
    mkl_object.weightRegNorm = path[4]
    mkl_object.fit_kernel(featsTr=feats_train,
                   targetsTr=labelsTr,
                   featsTs=feats_test,
                   targetsTs= labelsTs,
                   kernelFamily=path[0][0],
                   randomRange=[a, b],            
                   randomParams=[(a + b)/2, 1.0],  
                   hyper=path[3],       
                   pKers=path[2])
    # Returns the test error:
    return mkl_object.testerr

if __name__ == '__main__':

    p = Pool(3)
#### Loading the experimentation grid of parameters.
    grid = gridObj(file = 'gridParameterDic.txt')
    paths = grid.generateRandomGridPaths(trials = 3)
    print 'See the path list: ', paths
    [a, b, c] = paths
    # I already made tests with passing 'paths' and '[paths]' and the error is the same.
    print p.map(mkPool, [a, b, c])

以下の出力エラーを参照してください。

/usr/bin/python2.7 /home/.../mklCall.py
See the path list: [[('wave', [0.5, 100]), '2-gr', 7, 'weibull', 1.0, 0.4], [('spherical', [0.5, 50]), '2-gr_tfidf', 26, 'linear', 5.0, 20.0], [('exponential', [0.5, 50]), '3-gr_tfidf', 22, 'triangular', 1.5, 1.3]]
Traceback (most recent call last):
The entered hyperparameter distribution is not allowed: weibull
  File "../mklCall.py", line 76, in <module>
The entered hyperparameter distribution is not allowed: linear
    print p.map(mkPool, [a, b, c])
The entered hyperparameter distribution is not allowed: triangular
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 251, in map
    return self.map_async(func, iterable, chunksize).get()
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 558, in get
    raise self._value
TypeError: 'NoneType' object is not iterable

Process finished with exit code 1

上記の costum 例外はweibull(および表示される他のもの) が有効な文字列 (入力パラメーター) であるため、発生しないはずです。このように、実行中に原因不明の障害があるようです。このエラーは次のように繰り返されlen(paths)ます。

を使用せずに単一パスのトレーニングを実行すると、Pool.map()エラーは発生しません。

また、いくつかのパスに対して線形形式でコードを実行しましたが、エラーはありませんでした。

acc = []   
for path in paths:
    print 'A path: ', path
    acc.append(mkPool(path))
    print 'Accuracy: ', acc[-1]

Python のドキュメントhttps://docs.python.org/2/library/multiprocessing.htmlに従いました。提案、例、または可能な解決策は非常に高く評価されます。

前もって感謝します。

4

0 に答える 0