我正在使用Keras构建一个多类(3类)图像分类器。 我使用大约2000张图像(1500次训练/ 500次验证)的数据集训练了以下模型。
batch_size = 128
nb_classes = 3
nb_epoch = 25
img_rows, img_cols = 128, 128
input_shape = (1, img_rows, img_cols)
Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)
model = Sequential()
model.add(Convolution2D(32, 5, 5, border_mode='same', input_shape=input_shape))
model.add(Activation('relu'))
model.add(Convolution2D(64, 5, 5, border_mode='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Dense(nb_classes, activation='softmax'))
lrate = 0.001
decay = lrate/nb_epoch
sgd = SGD(lr=lrate, momentum=0.9, decay=decay, nesterov=False)
model.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=['accuracy'])
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
history = model.fit(X_train, Y_train,
batch_size=batch_size,
nb_epoch=nb_epoch,
validation_data=(X_test, Y_test),
shuffle=True,
callbacks=early_stopping)
我获得了95%的训练准确率,92%的验证准确率和94%的另一个单独的图像块(除了2000的数据集)。
因此,该模型似乎合理地分类。但是,我的问题是输入图像的预测概率(使用函数 predict_proba()获得)总是1.0或0.0。 同样地,如果我作为输入给出一个不属于3个类中的任何一个的图像,我会期望一些低概率(在最相似的类中可能更高),但我仍然在其中一个类中得到1.0并且0.0在其他人。
可能导致什么?在我看来,没有过度拟合。这个型号有什么问题吗? 可能是每个类的图像在它们之间非常相似,所以模型很快就对它的决定过于自信了吗?