我正在尝试使用神经网络进行分类。每个输入样本都有 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)
通常哪种方式更好分类?谢谢。
在处理分类任务时,特别是在处理多个类别时,在输出层中使用 softmax 激活以及分类交叉熵损失是标准做法。但是,还有其他方法可以解决此问题,我将与您提到的方法一起讨论它们。
One-Hot 编码输出(Softmax 激活):
categorical_crossentropy
。numpy.argmax()
。单神经元输出(二元分类的 Sigmoid 激活):
binary_crossentropy
。序数回归(用于有序多类分类):
对于具有三个不同类别(-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。