3

I am developing a neural network in order to classify with classes pre-calculated with k-means.

Dataset looks like:

50,12500,2,1,5
50,8500,2,1,15
50,6000,2,1,9
50,8500,2,1,15

Where resulting row is the last row. Here is the code on Python with Keras I am trying to get working:

import numpy
import pandas
from keras.models import Sequential
from keras.layers import Dense,Dropout
from keras.wrappers.scikit_learn import KerasClassifier
from keras.utils import np_utils
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.preprocessing import LabelEncoder
from sklearn.pipeline import Pipeline

# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)

# load dataset
dataset = numpy.genfromtxt ('../r-calculations/k-means/output16.csv', delimiter=",")
X = dataset[:,0:4].astype(float)
Y = dataset[:,4]
print(Y[0])
Y = np_utils.to_categorical(Y)

model = Sequential()
model.add(Dense(5, activation='tanh', input_dim=4))
#model.add(Dropout(0.25))
model.add(Dense(10, activation='tanh'))
#model.add(Dropout(0.25))
model.add(Dense(10, activation='relu'))
#model.add(Dropout(0.25))
model.add(Dense(17, activation='softmax'))

model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

model.fit(X,Y, epochs=10, batch_size=10)
#print( model.predict(numpy.array([2,36,2,5,2384,1,2,4,3,1,1,4,33,3,1,1,2,1,1,1]).reshape((1,20))) )
#print( model.predict(numpy.array(X[0]).reshape((1,4))) )
#print( model.predict(numpy.array(X[1]).reshape((1,4))) )
#print( model.predict(numpy.array(X[2]).reshape((1,4))) )
result = model.predict(numpy.array(X[0]).reshape((1,4)))
for res in result[0]:
    print res

If I get it right, now I am getting a probability for each class as an output. How can I retrieve labels back after I have called "to_categorical" on it?

Is there a way to get a class number, instead of probability for each class?

For now it does not seem to be working right, big loss ~2, accuracy ~0.29 and I cannot make it to converge. What am I doing wrong?

UPDATE Mar 19 So far I have solved my problem, I changed my model a lot of times and finally found working configuration.

Max Larionov
  • 420
  • 6
  • 19

1 Answers1

2

If you want the class instead of the probability you could call numpy argmax at your predictions.

Or use the convenient call predict_classes instead of predict

result = model.predict_classes(numpy.array(X[0]).reshape((1,4)))

As for your result, you could try running a few extra epochs, but it is hard to say what is wrong. Could be your training data quality, bad initialization, not having enough data, bad model (i'd use only relu activations).

maz
  • 1,980
  • 14
  • 17
  • Now, when I call "predict_classes", no matter what are inputs I always get [1] as an output – Max Larionov Mar 18 '17 at 12:14
  • then use argmax, that the solution :) For the result, is your dataset balanced? do you have samples in each classes or a few of them are very represented? – Nassim Ben Mar 18 '17 at 14:05
  • Some of classes have a lot of samples and some have a little. It's bad right? – Max Larionov Mar 18 '17 at 15:21
  • Yes. Suppose your classifier solely picks one class (bad), if you have many more samples of that single class than others, it means that this classifier would perform well. – maz Mar 19 '17 at 12:36