سؤال

أنا استخدم pyml لبناء آلة متجه الدعم الخطي متعدد الطبقات (SVM). بعد تدريب SVM ، أود أن أكون قادرًا على حفظ المصنف ، بحيث يمكنني استخدام المصنف على الفور دون إعادة التدريب. لسوء الحظ ، لا يتم تنفيذ وظيفة .save () لهذا المصنف ، ومحاولة المخلل (مع كل من المخلل القياسي و cpickle) تسفر رسالة الخطأ التالية:

pickle.PicklingError: Can't pickle : it's not found as __builtin__.PySwigObject

هل يعرف أي شخص طريقة للتغلب على هذا أو مكتبة بديلة بدون هذه المشكلة؟ شكرًا.

تحرير/تحديث
أنا الآن أتدرب وأحاول حفظ المصنف مع الكود التالي:

mc = multi.OneAgainstRest(SVM());
mc.train(dataset_pyml,saveSpace=False);
    for i, classifier in enumerate(mc.classifiers):
        filename=os.path.join(prefix,labels[i]+".svm");
        classifier.save(filename);

لاحظ أنني الآن أنقذ مع آلية حفظ pyml بدلاً من التخليل ، وأنني قد مررت "Savespace = false" إلى وظيفة التدريب. ومع ذلك ، ما زلت أحصل على خطأ:

ValueError: in order to save a dataset you need to train as: s.train(data, saveSpace = False)

ومع ذلك ، فأنا أمر Savespace = False ... لذا ، كيف يمكنني حفظ المصنف (S)؟

ملاحظة
المشروع الذي أستخدمه في هذا Pyimgattr, ، في حال ترغب في الحصول على مثال كامل قابل للاختبار ... يتم تشغيل البرنامج مع ". أيضا ، ملاحظة حول معلومات الإصدار:

[michaelsafyan@codemage /Volumes/Storage/classes/cse559/pyimgattr]$ python
Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import PyML
>>> print PyML.__version__
0.7.0
هل كانت مفيدة؟

المحلول 2

احصل على نسخة أحدث من Pyml. منذ الإصدار 0.7.4 ، من الممكن حفظ مصنف OneAgainStrest (مع .save () و .load ()) ؛ قبل هذا الإصدار ، يكون حفظ/تحميل المصنف غير تافهة ومعرض للخطأ.

نصائح أخرى

في multi.py على السطر 96 "self.classifiers [i] .rtrain (datai)" تسمى دون أن يمر "** args" ، بحيث إذا استدعت "mc.train (data ، savespace = false)" ، هذا السحب -يضيع Argument. هذا هو السبب في حصولك على رسالة خطأ إذا حاولت حفظ المصنفات في كلاسك متعدد الطبقات بشكل فردي. ولكن إذا قمت بتغيير هذا السطر لتمرير جميع الوسائط ، فيمكنك حفظ كل مصنف بشكل فردي:

#!/usr/bin/python

import numpy

from PyML.utils import misc
from PyML.evaluators import assess
from PyML.classifiers.svm import SVM, loadSVM
from PyML.containers.labels import oneAgainstRest
from PyML.classifiers.baseClassifiers import Classifier
from PyML.containers.vectorDatasets import SparseDataSet
from PyML.classifiers.composite import CompositeClassifier

class OneAgainstRestFixed(CompositeClassifier) :

    '''A one-against-the-rest multi-class classifier'''

    def train(self, data, **args) :
        '''train k classifiers'''

        Classifier.train(self, data, **args)

        numClasses = self.labels.numClasses
        if numClasses <= 2:
            raise ValueError, 'Not a multi class problem'

        self.classifiers = [self.classifier.__class__(self.classifier)
                            for i in range(numClasses)]

        for i in range(numClasses) :
            # make a copy of the data; this is done in case the classifier modifies the data
            datai = data.__class__(data, deepcopy = self.classifier.deepcopy)
            datai =  oneAgainstRest(datai, data.labels.classLabels[i])

            self.classifiers[i].train(datai, **args)

        self.log.trainingTime = self.getTrainingTime()

    def classify(self, data, i):

        r = numpy.zeros(self.labels.numClasses, numpy.float_)
        for j in range(self.labels.numClasses) :
            r[j] = self.classifiers[j].decisionFunc(data, i)

        return numpy.argmax(r), numpy.max(r)

    def preproject(self, data) :

        for i in range(self.labels.numClasses) :
            self.classifiers[i].preproject(data)

    test = assess.test

train_data = """
0 1:1.0 2:0.0 3:0.0 4:0.0
0 1:0.9 2:0.0 3:0.0 4:0.0
1 1:0.0 2:1.0 3:0.0 4:0.0
1 1:0.0 2:0.8 3:0.0 4:0.0
2 1:0.0 2:0.0 3:1.0 4:0.0
2 1:0.0 2:0.0 3:0.9 4:0.0
3 1:0.0 2:0.0 3:0.0 4:1.0
3 1:0.0 2:0.0 3:0.0 4:0.9
"""
file("foo_train.data", "w").write(train_data.lstrip())

test_data = """
0 1:1.1 2:0.0 3:0.0 4:0.0
1 1:0.0 2:1.2 3:0.0 4:0.0
2 1:0.0 2:0.0 3:0.6 4:0.0
3 1:0.0 2:0.0 3:0.0 4:1.4
"""
file("foo_test.data", "w").write(test_data.lstrip())

train = SparseDataSet("foo_train.data")
mc = OneAgainstRestFixed(SVM())
mc.train(train, saveSpace=False)

test = SparseDataSet("foo_test.data")
print [mc.classify(test, i) for i in range(4)]

for i, classifier in enumerate(mc.classifiers):
    classifier.save("foo.model.%d" % i)

classifiers = []
for i in range(4):
    classifiers.append(loadSVM("foo.model.%d" % i))

mcnew = OneAgainstRestFixed(SVM())
mcnew.labels = misc.Container()
mcnew.labels.addAttributes(test.labels, ['numClasses', 'classLabels'])
mcnew.classifiers = classifiers
print [mcnew.classify(test, i) for i in range(4)]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top