【问题标题】:Multi-class classification using keras使用 keras 进行多类分类
【发布时间】:2017-03-18 10:28:37
【问题描述】:

我正在开发一个神经网络,以便使用预先用 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 日更新 到目前为止我已经解决了我的问题,我改变了我的模型很多次,终于找到了工作配置。

【问题讨论】:

  • 嗨,你能发布你找到的工作配置吗?

标签: python machine-learning tensorflow keras


【解决方案1】:

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

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

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

至于你的结果,你可以尝试多运行几个 epoch,但很难说哪里出了问题。可能是您的训练数据质量、初始化错误、数据不足、模型错误(我只会使用 relu 激活)。

【讨论】:

  • 现在,当我调用“predict_classes”时,无论输入是什么,我总是得到 [1] 作为输出
  • 然后使用 argmax,该解决方案 :) 对于结果,您的数据集是否平衡?您在每个班级中都有样本吗?或者其中一些很有代表性?
  • 有些课程有很多样本,有些课程很少。不好吗?
  • 是的。假设你的分类器只选择一个类(坏的),如果你有比其他类更多的样本,这意味着这个分类器会表现良好。
猜你喜欢
  • 2017-09-27
  • 2021-02-17
  • 2018-02-17
  • 2019-08-08
  • 2019-06-24
  • 2018-12-15
  • 2020-06-26
  • 2018-09-29
  • 2017-10-25
相关资源
最近更新 更多