2016-07-28 5 views
2

나는 Keras와 더미 데이터 세트로 놀고있었습니다. RBF 커널이있는 표준 SVM에 비해 신경 네트워크가 얼마나 잘 작동하는지보고 싶었습니다. 과제는 간단합니다 : {0,1,2} 집합에있는 20 차원 벡터의 클래스를 예측합니다.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

더미 데이터를 제; 신경 네트워크 빨려; SVM은 그것을 쫓아 냈다. 제발 도와주세요

+0

신경망은 규모에 민감합니다. 데이터를 표준화 해보십시오. – Wboy

+0

왜 MSE 손실입니까? 교차 엔트로피는 분류를 위해 훨씬 잘 작동합니다. –

답변

1

예를 여러 번 시도한 결과, 학습 기술에 관계없이 정확도가 0.3에서 0.9 사이에서 변동한다는 것을 알았습니다. 그것은 내가 다른 접근 매개 변수에 대한

의 정확성을 비교하는 MNIST 같은 의미있는 데이터 세트를 사용하는 것이 좋습니다 백색 잡음

내부의 기능을 인식하는 것이 거의 가능 - 나는 때문에 무작위 의미의 데이터 이런 일이 있다고 생각합니다. Matias에 대해 언급했듯이이 경우에는 categorical_crossentropy를 사용하는 것이 좋습니다. 또한 매개 변수의 수동 튜닝을 원하지 않으면 adadelta optimizer를 사용하는 것이 좋습니다.

+0

흠, 그렇지만 SVM이 더미 데이터 세트 임에도 불구하고 SVM이 작업에서 NN을 이길 수있는 방법을 여전히 이해하지 못합니다. 나는 SVM을 위해 RBF 커널을 사용했다.하지만 이것은 MLP와 동일해야한다. –

+0

멀티 클래스 컨버터에 따라 다릅니다. 어쩌면 당신은 SoftMax와는 다른 방식으로 변환을했을 것입니다. SoftMax는 출력 중 하나만 활성화 될 수있는 방식으로 처리하므로 SoftMax의 경우 인식 (1,0,0), (0,1,0), (0,0,1) . SoftMax에서 정확성이 떨어지는 또 다른 이유는 (1,0,1), (1,1,0), 심지어 (1,1,1)과 같은 샘플을 볼 수 있기 때문입니다. 이는 예제가 다른 클래스에 속할 수 있음을 의미합니다. 같은 시간. 나는 그것에 대한 실제 사례를 볼 수 없다. 예를 들어, digit는 클래스 숫자 "0"과 "9"에 속할 수 없습니다. –

+0

시도해 볼 수 있습니다. numpy를 np dummyX = np.random.random ((1000, 784)) dummyX = np로 가져옵니다. 대신 : dummyX, dummyY = make_multilabel_classification (n_samples = 4000, random_random (4000, 20)) dummyY = np_utils.to_categorical (np.random.randint (3, size = nooks = 20, n_classes = 3) 무의미한 데이터로 인해 SoftMax로 MLP의 정확성이 향상되지는 않지만 무작위 데이터를 사용하면 MLP + SoftMax와 다른 방법을 비교할 수 있습니다. 어떤 의미가있다 –