我在构建一个Keras模型,用于将数据分类到9个类别之一。问题是它只能在设计用于二元输出的Sigmoid激活函数下工作,使用其他激活函数会导致准确率为0。为了能够对每个标签进行分类,我需要做哪些更改?
#Reshape data to add new dimensionX_train = X_train.reshape((100, 150, 1)) Y_train = X_train.reshape((100, 1, 1)) model = Sequential() model.add(Conv1d(1, kernel_size=3, activation='relu', input_shape=(None, 1))) model.add(Dense(1)) model.add(Activation('sigmoid')) model.compile(loss='categorical_hinge', optimizer='adam', metrics=['accuracy']) model.fit(x=X_train,y=Y_train, epochs=200, batch_size=20)
回答:
在多类别分类的情况下,单一单元的密集层并不是我们使用的;你首先应该确保你的Y
数据是独热编码的 – 如果不是,你可以使用Keras的实用函数来进行编码:
num_classes=9Y_train = keras.utils.to_categorical(Y_train, num_classes)
然后将你的最后一层更改为:
model.add(Dense(num_classes)) model.add(Activation('softmax'))
另外,如果你没有特别的理由使用分类铰链损失,我建议在模型编译时使用loss='categorical_crossentropy'
。
不过,你的模型似乎过于简单,你可能需要尝试添加更多的层…