如何使用神经网络进行分类

问题描述 投票:0回答:1

我正在尝试使用神经网络进行分类。每个输入样本都有 20 个二元连续变量特征。输出为 -1、0 和 1。预处理数据的一种方法是使用

to_categorical()
将输出转换为 one_hot 向量。部分代码如下。

model = Sequential()
model.add(Dense(20, input_shape=(20,)))
model.add(Dense(15, activation='relu'))
model.add(Dense(12, activation='relu'))
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train_one_hot, epochs=500, batch_size=32)

testPredict = model.predict(X_test)

我想知道这是否是进行分类的唯一方法?我也尝试了以下代码,但是,它返回浮点数而不是整数。有没有办法将浮点数转换为整数?

model = Sequential()
model.add(Dense(20, input_shape=(20,)))
model.add(Dense(15, activation='tanh'))
model.add(Dense(12, activation='tanh'))
model.add(Dense(1, activation='tanh')) 
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=500, batch_size=32)

testPredict = model.predict(X_test)

通常哪种方式更好分类?谢谢。

python neural-network classification
1个回答
0
投票

在处理分类任务时,特别是在处理多个类别时,在输出层中使用 softmax 激活以及分类交叉熵损失是标准做法。但是,还有其他方法可以解决此问题,我将与您提到的方法一起讨论它们。

  1. One-Hot 编码输出(Softmax 激活)

    • 这是您在第一个代码片段中使用的方法。对于 3 类问题,输出层将有 3 个神经元,每个神经元代表样本属于该类的概率。 softmax 函数确保这些概率的总和为 1。
    • 本例中使用的损失函数是
      categorical_crossentropy
    • 要从预测概率中获取类标签,请在输出轴上使用
      numpy.argmax()
  2. 单神经元输出(二元分类的 Sigmoid 激活):

    • 此方法适用于二元分类任务。输出是具有 sigmoid 激活的单个神经元,该神经元给出属于某一类别的概率。
    • 要使用的损失函数是
      binary_crossentropy
    • 要将浮点输出转换为整数,可以使用阈值(例如 0.5)。如果输出大于阈值,则分类为1类;否则,分类为 0 类。
  3. 序数回归(用于有序多类分类)

    • 如果您的类具有序数关系(即存在低、中、高等顺序),则可以使用序数回归。这更接近您尝试的第二种方法,但对于一般的多类任务来说并不常见。
    • 通常,此方法使用自定义激活函数和损失函数。

对于具有三个不同类别(-1、0 和 1)的特定问题,建议使用第一种方法(使用 softmax 激活的单热编码)。您提到的第二种方法不是多类分类的标准方法,更适合回归任务。在这种方法中,您使用具有 tanh 激活的单个神经元,它输出 -1 到 1 之间的值,这就是您获得浮点值的原因。如果您确实想使用这种方法,则必须对输出进行舍入或分箱以获得整数类标签,但不建议您在任务中这样做。

推荐

坚持使用带有 softmax 激活的 one-hot 编码输出。这是多类分类的标准方法,很可能会给您带来最佳结果。如果您想要预测概率中的整数类标签,请使用:

predicted_classes = np.argmax(testPredict, axis=1) - 1

最后的

- 1
是将类0、1、2分别映射回-1、0、1。

© www.soinside.com 2019 - 2024. All rights reserved.