Keras Python 中的分类

Posted

技术标签:

【中文标题】Keras Python 中的分类【英文标题】:Categorical classification in Keras Python 【发布时间】:2018-09-26 22:20:13 【问题描述】:

我正在做 5 个类的多类分类。我正在使用带有 Keras 的 Tensorflow。我的代码是这样的:

# load dataset
dataframe = pandas.read_csv("Data5Class.csv", header=None)
dataset = dataframe.values
# split into input (X) and output (Y) variables
X = dataset[:,0:47].astype(float)
Y = dataset[:,47]
print("Load Data.....")

encoder= to_categorical(Y)

def create_larger():  
    model = Sequential()
    print("Create Dense Ip & HL 1 Model ......")
    model.add(Dense(47, input_dim=47, kernel_initializer='normal',     activation='relu'))
    print("Add Dense HL 2 Model ......")
    model.add(Dense(40, kernel_initializer='normal', activation='relu'))
    print("Add Dense output Model ......")
    model.add(Dense(5, kernel_initializer='normal', activation='sigmoid'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

estimators = []
estimators.append(('rnn', KerasClassifier(build_fn=create_larger, epochs=60,  batch_size=10, verbose=0)))
pipeline = Pipeline(estimators)
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)
results = cross_val_score(pipeline, X, encoder, cv=kfold)
print("Accuracy: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

我作为输入的 CSV 文件包含带有标签的数据。标签就像这样0, 1, 2, 3, 4,代表 5 个不同的类。

    那么,由于标签已经是整数形式,我需要使用 我的代码中的 LabelEncoder() 函数?

    另外,我使用了to_categorical(Y) 函数。我应该使用它还是应该将包含这些标签的 Y 变量传递给分类器进行训练?

    我收到如下错误: 支持的目标类型是:('binary', 'multiclass')。取而代之的是“多标签指示器”。 当我在代码中使用编码器变量时发生此错误 results = cross_val_score(pipeline, X, encoder, cv=kfold) 其中编码器变量表示 to_categorical(Y) 数据。如何解决这个错误?

【问题讨论】:

无需使用 LabelEncoder()。但是to_categorical() 的使用取决于 Keras 模型中使用的损失函数。显示该代码。 是的。我使用了 categorical_crossentropy 损失函数。代码是这样的:model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 您不能在 cross_val_score 中使用带有 StratifiedKFold 的 Keras 估计器。您需要为此编写一个自定义交叉验证,其中传递给 StratifiedKFold 的数据应该是原始的 y,然后在拆分后应该用 to_categorical() 编码并传递给 Keras。 【参考方案1】:

正如Keras documentation here中提到的:

注意:使用 categorical_crossentropy 损失时,您的目标 应该是分类格式(例如,如果您有 10 个类,则 每个样本的目标应该是一个 10 维向量,即 全零,除了对应于类的索引处的 1 样本)。为了将整数目标转换为分类 目标,您可以使用 Keras 实用程序 to_categorical:

from keras.utils.np_utils import to_categorical
categorical_labels = to_categorical(int_labels, num_classes=None)

所以这意味着你需要在训练之前对你的y 使用to_categorical() 方法。但如果y 已经是整数类型,则无需使用LabelEncoder。

【讨论】:

是的,先生。我尝试在我的代码中只使用 to_categorical(Y) 。但是,如果我只使用它并尝试运行它。它显示错误。 ValueError:支持的目标类型是:('binary','multiclass')。取而代之的是“多标签指示器”。 因此,我没有包括 to_categorical(Y)。那么它会给出正确的准确性结果吗? @AmulyaDixit 您在哪个代码上收到错误“Got 'multilabel-indicator' instead.”。请编辑问题。而且,不,如果您不包含 to_categorical,您将不会得到正确的结果 seed = 7 numpy.random.seed(seed) dataframe = pandas.read_csv("Data.csv", header=None) dataset = dataframe.valuesX = dataset[:,0:47]。 astype(float) Y = 数据集[:,47] @AmulyaDixit 不要在这里发帖。编辑问题

以上是关于Keras Python 中的分类的主要内容,如果未能解决你的问题,请参考以下文章

Keras 中的多分类预测不止一个?

带有变压器的分类模型的 keras 模型中的错误

如何在 keras 中进行深度学习中的多标签分类?

多标签分类keras中的奇怪准确性

Keras 中的多步多元时间序列分类

keras中的级联模型(自动编码器+分类器)