使用Keras进行多类分类

3

我正在开发一个神经网络来对使用k-means预计算出的类进行分类。

数据集看起来像这样:

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

当结果行为最后一行时。 这是我在使用Keras的Python代码:

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

如果我理解正确,现在我得到了每个类别的概率作为输出。在我调用“to_categorical”之后,如何获取标签?
是否有一种方法可以获取每个类别的类号,而不是概率?
目前似乎没有正常工作,大损失~2,精度~0.29,我无法使其收敛。我做错了什么?
更新3月19日 到目前为止,我已经解决了我的问题,我多次更改了我的模型,并最终找到了可行的配置。

你好,能否发布你找到的工作配置? - Olivier
1个回答

2

如果你想要类别而不是概率,你可以在预测结果上调用numpy argmax。

或者使用方便的predict_classes调用,而不是predict。

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

关于你的结果,你可以尝试运行更多的时代,但很难说出问题出在哪里。可能是你的训练数据质量、错误的初始化、不足够的数据、错误的模型(我只会使用relu激活函数)。


现在,当我调用“predict_classes”时,无论输入是什么,我总是得到[1]作为输出。 - Max Larionov
然后使用argmax,这就是解决方案 :) 对于结果,你的数据集是否平衡?每个类别都有样本还是其中一些被很好地代表了? - Nassim Ben
一些类有很多示例,而另一些则只有一些。这是不好的,对吧? - Max Larionov
是的。假设您的分类器仅选择一个类别(差),如果该单个类别有比其他类别更多的样本,则意味着该分类器将表现良好。 - maz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接