代码之家  ›  专栏  ›  技术社区  ›  Harry

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

  •  -3
  • Harry  · 技术社区  · 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)
    

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

    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)
    

    哪种方式通常更适合分类?谢谢

    1 回复  |  直到 1 年前
        1
  •  1
  •   Андрей Толстой    1 年前

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

    1. 一个热编码输出(Softmax激活) :

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

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

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

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

    正式建议 :

    坚持使用softmax激活的一个热编码输出。这是多类分类的标准方法,可能会给你最好的结果。如果您希望从预测的概率中获得整数类标签,请使用:

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

    这个 - 1 最后是将类0、1和2分别映射回-1、0和1。