0

我正在尝试为 CIFAR-10 数据创建一个简单的分类器,但是当我尝试执行此 python 代码时:

import cPickle
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import LinearSVC


def unpickle(file):
    with open(file, 'rb') as fo:
        dict = cPickle.load(fo)
    return dict


def main():
    s="data_batch_"
    dicts=[None]*5
    for i in xrange(1,6):
        dicts[i-1]=unpickle(s+str(i))

    X, y = dicts[0]['data'], dicts[0]['labels']
    for i in xrange(1,5):
       X = np.concatenate((X, dicts[i]['data']))
       y = np.concatenate((y, dicts[i]['labels']))
    classifier=OneVsRestClassifier(LinearSVC(random_state=0)).fit(X, y)

只要 X 和 y 的大小不太大 - 10000,或多或少一点,它就可以正常工作。但是当我尝试了 2 个批次的 20000 个样本(或所有 5 个批次的 50000 个样本)时,我得到了“Python.exe 停止工作”的弹出窗口。是代码本身有问题还是内存用完了?

如果内存确实用完了,我该怎么办?是否可以执行 fit(X,y) 5 次,每个批次的每个循环?

4

2 回答 2

0

您的分类器LinearSVC不支持(小)批次。

您将需要选择此列表中给出的选项之一。

根据这些,可以将SGDClassifier参数化为线性 SVM(默认!)。

因此,您可以尝试直接在所有数据上使用它,或者抽象您的输入数据生成并手动使用partial_fit 。但是使用预处理/归一化并检查超参数(学习率和学习率计划)。

于 2017-12-12T18:28:22.737 回答
-1

对于某些应用程序,示例、特征(或两者)的数量和/或它们需要处理的速度对于传统方法来说是具有挑战性的。在这些情况下,scikit-learn 有许多选项可供您考虑以使您的系统扩展。

核外(或“外部存储器”)学习是一种用于从无法放入计算机主存储器 (RAM) 的数据中学习的技术。以下是为实现此目标而设计的系统草图: 1. 流式传输实例的方法 2. 从实例中提取特征的方法 3. 增量算法

流式实例 基本上,1. 可能是从硬盘驱动器、数据库、网络流等文件中生成实例的读取器。但是,如何实现这一点的详细信息超出了本文档的范围。

提取特征 2. 可以是 scikit-learn 支持的不同特征提取方法中提取特征的任何相关方法。但是,在处理需要矢量化的数据以及事先不知道一组特征或值的数据时,应该特别注意。一个很好的例子是文本分类,在训练过程中可能会发现未知术语。如果从应用程序的角度来看,对数据进行多次传递是合理的,则可以使用有状态矢量化器。否则,可以通过使用无状态特征提取器来提高难度。目前,首选的方法是使用由 sklearn.feature_extraction.FeatureHasher 实现的所谓散列技巧,用于具有表示为 Python dicts 或 sklearn.feature_extraction.text 列表的分类变量的数据集。

增量学习 最后,对于 3. 我们在 scikit-learn 中有许多选项。尽管所有算法都不能增量学习(即一次看不到所有实例),但所有实现 partial_fit API 的估计器都是候选者。实际上,从小批量实例中增量学习的能力(有时称为“在线学习”)是核外学习的关键,因为它保证在任何给定时间,在主内存。为平衡相关性和内存占用的小批量选择合适的大小可能涉及一些调整 [1]。

对于分类,需要注意的重要一点是,尽管无状态特征提取例程可能能够处理新的/未见的属性,但增量学习器本身可能无法处理新的/未见的目标类。在这种情况下,您必须使用 classes= 参数将所有可能的类传递给第一个 partial_fit 调用。

选择合适的算法时要考虑的另一个方面是,随着时间的推移,它们都不会对每个示例赋予相同的重要性。也就是说,即使在许多示例之后,感知器仍然对标记错误的示例敏感,而 SGD* 和 PassiveAggressive* 系列对这种伪像更加健壮。相反,当学习率随着时间的推移而下降时,后者也倾向于不太重视显着不同但正确标记的示例。

祝你好运!

于 2017-12-12T18:20:17.940 回答