为什么我的 Keras Conv Net 只返回 1?

数据挖掘 机器学习 深度学习 喀拉斯 美国有线电视新闻网 卷积神经网络
2022-03-09 08:48:31
   model = Sequential()
   model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(img_h_w,img_h_w,1)))
   model.add(Conv2D(32, (3, 3), activation='relu'))
   model.add(MaxPooling2D(pool_size=(2,2)))
   model.add(Dropout(0.25))
   model.add(Flatten())
   model.add(Dense(128, activation='relu'))
   model.add(Dropout(0.5))
   model.add(Dense(1, activation='softmax'))
   model.compile(loss='binary_crossentropy', optimizer=keras.optimizers.SGD(lr=0.01),metrics=['accuracy'])
   model.fit(x_train, y_train, batch_size=100, epochs=3, verbose=1)
   score = model.evaluate(x_test, y_test, verbose=0)

运行此返回

2500/2500 [==============================] - 5s 2ms/step - loss: 7.5694 - acc: 0.5252
Epoch 2/3
2500/2500 [==============================] - 5s 2ms/step - loss: 7.5694 - acc: 0.5252
Epoch 3/3
2500/2500 [==============================] - 6s 2ms/step - loss: 7.5694 - acc: 0.5252

这表明准确度为 50%,当我查看所做的预测时,我看到它只输出 1。这意味着将图像分类为 0 或 1。

2个回答

它只输出 1,因为softmax在给定单个输入时没有任何意义。计算的 Softmax等价于xexex=1

换句话说,线

model.add(Dense(1, activation='softmax'))

是错的。改用sigmoid

model.add(Dense(1, activation='sigmoid'))

或阅读更多关于 one-hot 编码您的预期输出和辅助函数https://keras.io/utils/#to_categorical的信息。

对于二元分类,您可以将softmax其用作输出层,但您应该考虑,如果这样做,您的最后一层必须有两个神经元,每个神经元对应一个特定的类。此外,您必须使用categorical_crossentropy损失函数。更改以下代码:

model.add(Dense(1, activation='softmax'))
model.compile(loss='binary_crossentropy', optimizer=keras.optimizers.SGD(lr=0.01),metrics=['accuracy'])

到:

model.add(Dense(2, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.SGD(lr=0.01),metrics=['accuracy'])