【问题标题】:Keras low accuracy classification taskKeras 低准确率分类任务
【发布时间】:2016-12-03 13:03:22
【问题描述】:

我在玩 Keras 和一个虚拟数据集。我想看看与带有 RBF 内核的标准 SVM 相比,神经网络能做得更好。任务很简单:预测集合 {0,1,2} 中 20 维向量的类别。

我注意到神经网络做得很糟糕。 SVM 的正确率约为 90%,而神经网络的正确率为 40%。我在我的代码中做错了什么?这很可能是我的错误,但在 NN 上尝试了各种参数几个小时后,我放弃了。

代码

from sklearn.datasets import make_multilabel_classification
from sklearn.svm import SVC

from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD, RMSprop
from keras.utils import np_utils
from keras.datasets import mnist

# generate some data
dummyX, dummyY = make_multilabel_classification(n_samples=4000, n_features=20, n_classes=3)

# neural network
model = Sequential()
model.add(Dense(20, input_dim=20))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(20))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(3))
model.add(Activation('softmax'))

model.compile(loss='mean_squared_error',
          optimizer='sgd',
          metrics=['accuracy'])

X_train, X_test, y_train, y_test = train_test_split(dummyX, dummyY, test_size=0.20, random_state=42)

model.fit(X_train, y_train,nb_epoch=20, batch_size=30, validation_data=(X_test, y_test))
# Epoch 20/20
# 3200/3200 [==============================] - 0s - loss: 0.2469 - acc: 0.4366 - val_loss: 0.2468 - val_acc: 0.4063
# Out[460]:


# SVM - note that y_train and test are binary label. I haven't included the multi class converter code here for brevity
svm = SVC()
svm.fit(X_train, y_train)
svm.score(X_test, y_test)
# 0.891249

TL;DR

制作虚拟数据;神经网络很烂; SVM 踢了它。请帮忙

【问题讨论】:

  • 神经网络对规模敏感。尝试标准化您的数据。
  • 为什么 MSE 会丢失?交叉熵更适合分类。

标签: python neural-network gpu theano keras


【解决方案1】:

多次尝试您的示例后,我发现无论学习技术如何,准确率都会在 0.3 到 0.9 之间波动。我相信这是因为随机且无意义的数据造成的——几乎不可能识别白噪声中的任何特征

我建议使用MNIST 等有意义的数据集来比较不同方法的准确性

关于参数。正如它提到的 Matias,在这种情况下最好使用 categorical_crossentropy。如果您不想手动调整参数,我建议您使用 adadelta 优化器

【讨论】:

  • 嗯,我明白了,但我仍然不明白 SVM 如何在一项任务中击败 NN,即使它是一个虚拟数据集。我为 SVM 使用了 RBF 内核,但这应该等同于 MLP,不是吗?
  • 这取决于你的多类转换器。也许您以与 SoftMax 不同的方式进行转换。 SoftMax 这样做的方式是只有一个输出可以处于活动状态,因此对于 SoftMax,我们只有 3 个可能的识别类别 (1,0,0), (0,1,0),(0,0,1) .这可能是 SoftMax 准确性低的另一个原因,因为我可以看到像 (1,0,1)、(1,1,0) 甚至 (1,1,1) 这样的样本,这意味着样本可以属于不同的类别同时。我看不到真实的案例。例如,数字不能同时属于类数字“0”和“9”
  • 你可以试试: import numpy as np dummyX = np.random.random((1000, 784)) dummyX = np.random.random((4000, 20)) dummyY = np_utils.to_categorical (np.random.randint(3, size=(4000, 1))) 取而代之的是: dummyX, dummyY = make_multilabel_classification(n_samples=4000, n_features=20, n_classes=3) 它不会提高 MLP 的准确性SoftMax 因为无意义的数据,但它会让你有机会通过使用随机数据更公平地比较其他方法与 MLP + SoftMax,如果有任何意义的话
猜你喜欢
  • 2019-02-14
  • 2020-04-23
  • 2020-02-12
  • 2020-06-29
  • 2018-09-18
  • 2020-10-17
  • 2020-10-11
  • 2020-02-11
  • 1970-01-01
相关资源
最近更新 更多