Tensorflow 支持向量机在训练大类分类器时速度很慢

Tensorflow 支持向量机在训练大类分类器时速度很慢,tensorflow,machine-learning,keras,neural-network,svm,Tensorflow,Machine Learning,Keras,Neural Network,Svm,我尝试在大量的项目和类上训练SVM分类器,这会变得非常非常缓慢 首先,我已经从我的数据中提取了一个特征集,具体到512个特征,并将其放入numpy数组中。此阵列中有13k个项目。看起来是这样的: >>print(type(X_train)) <class 'numpy.ndarray'> >>print(X_train) [[ 0.01988654 -0.02607637 0.04691431 ... 0.11521499 0.03433102 0

我尝试在大量的项目和类上训练SVM分类器,这会变得非常非常缓慢

首先,我已经从我的数据中提取了一个特征集,具体到512个特征,并将其放入numpy数组中。此阵列中有13k个项目。看起来是这样的:

>>print(type(X_train))
<class 'numpy.ndarray'>

>>print(X_train)
[[ 0.01988654 -0.02607637  0.04691431 ...  0.11521499  0.03433102
  0.01791015]
[-0.00058317  0.05720023  0.03854145 ...  0.07057668  0.09192026
  0.01479562]
[ 0.01506544  0.05616265  0.01514515 ...  0.04981219  0.05810429
  0.00232013]
...
大约90个小时后,我使用GPU实现的sci学习工具包(以ThunderVM的形式)仍然在运行。考虑到这是一个非常小的数据集在我的情况下,我肯定需要一些更有效的,但我似乎没有任何良好的成功。例如,我尝试过这种类型的Keras模型:

model = Sequential()
model.add(Dense(input_dim=512, units=100, activation='tanh'))
model.add(Dropout(0.2))
model.add(Dense(units=n_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adadelta', metrics=['accuracy'])
model.fit(X_train, labels, epochs=500, batch_size=64, validation_split=0.1, shuffle=True)
在训练阶段,我的准确度非常高:

Epoch 500/500
11988/11988 [==============================] - 1s 111us/step - loss: 2.1398 - acc: 0.8972 - val_loss: 9.5077 - val_acc: 0.0000e+00
然而,在实际测试期间,即使是在训练数据集中存在的数据上,我也得到了极低的准确性,预测基本上是随机的类:

Predictions (best probabilities):
  0  class710015: 0.008
  1  class715573: 0.007
  2  class726619: 0.006
  3  class726619: 0.010
  4  class720439: 0.007
Accuracy: 0.000
你能用这个给我指一下正确的方向吗?对于这类问题,我应该调整SVM方法还是切换到自定义的Keras模型?如果是,我的模型可能存在什么问题


非常感谢。

如果SVC实现依赖于多类SVC的scikit学习实现,则不应使用该SVC实现。在it状态下,多类支持按照一对一方案处理。这意味着每对类训练一个分类器,即训练约2^4k分类器。您可以使用内在多类下列出的任何内容

此外,您的Keras实现可能还需要另一层。我假设输出层每个类有一个神经元,在这种情况下,您需要使用分类交叉熵和softmax激活,以及一个热编码


我现在假设您的所有示例只有一个类标签

SVM是最自然的二值分类方法。对于多类,scikit learn使用一对一组合OK^2二进制分类器,K为类数。所以,运行时间与K^2成正比,或者在你的例子中,是1600万。这就是它如此缓慢的原因

您应该减少类的数量,或者切换到其他模型,如神经网络或决策树


另外:scikit learn还有一种支持向量机的一对多方法,这是可以的。您也可以试试这个。

谢谢您的回答。顺便说一下,您的假设是正确的,我的示例只有一个类标签。因此,据我所知,我应该放弃SVM SVC实现。此外,实际上建议使用二进制交叉熵损失函数和sigmoid激活函数进行多类分类,因此问题不一定在模型的这一部分。你能给我一个引用@none32吗?当然。我在那里发现了这个信息:我相信你在这里不是这么说的。在几乎所有的神经网络设置中,你都应该对你的类进行热编码。在这个设置中,他们说如果你在做多标签分类,那么二进制交叉熵是正确的。您之前说过,您的每个示例都有一个标签,因此,它不是多标签,因此它应该是一个用分类交叉熵进行热编码的标签。谢谢您的回答。正如我所说的,我曾尝试将Keras用于神经网络来解决这个分类问题,尝试了很多不同的模型配置,但仍然没有得到好的结果。请你就我的问题的模型结构向我指出写作方向好吗?你不能期望有这么多的类有很好的准确性。通常,大量的课程需要大量的深度神经网络和相当长的训练时间。您可以查看在CIFAR-100上运行的一些文件,其中应该有许多文件可以查看最先进的技术。我不能告诉你正确的结构,因为你没有对这个问题作任何说明。
Epoch 500/500
11988/11988 [==============================] - 1s 111us/step - loss: 2.1398 - acc: 0.8972 - val_loss: 9.5077 - val_acc: 0.0000e+00
Predictions (best probabilities):
  0  class710015: 0.008
  1  class715573: 0.007
  2  class726619: 0.006
  3  class726619: 0.010
  4  class720439: 0.007
Accuracy: 0.000