2016-07-28 44 views
2

我正在玩Keras和一個虛擬數據集。我想看看與帶有RBF內核的標準SVM相比,神經網絡會做得更好。該任務很簡單:預測集合{0,1,2}中的20-dim向量的類別。Keras低精度分類任務

我注意到神經網絡確實很可怕。 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

製成僞數據;神經網絡被吸引;支持向量機踢了它的武裝。請幫助

+0

神經網絡是敏感的規模。嘗試規範化你的數據。 – Wboy

+0

爲什麼MSE損失?交叉熵在分類上效果更好。 –

回答

1

經過您的示例的幾次嘗試,我發現無論學習技術如何,準確度在0.3到0.9之間波動。我認爲,這種情況的發生,因爲隨機的和無意義的數據 - 這是幾乎不可能認識裏面的白噪聲

任何功能,我建議使用像MNIST有意義的數據集來比較不同的方法

關於參數的準確性。正如它提到的Matias,最好在這種情況下使用categorical_crossentropy。此外,我建議使用adadelta優化器,如果你不想手動調整參數

+0

嗯,我明白了,但我仍然不明白SVM如何在任務中擊敗NN,即使它是一個虛擬數據集。我將RBF內核用於SVM,但這應該相當於MLP,不是嗎? –

+0

這取決於你的多級轉換器。也許你以不同於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」同時 –

+0

您可以嘗試: 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) 由於沒有意義的數據,它不會增加MLM與SoftMax的準確性,但它可以讓您有機會使用隨機數據比較其他方法與MLP + SoftMax的比較有道理 –