如何在 Keras 模型中创建"none of the above"标签



我正在处理一个简单的图像分类。每个物体必须根据其材料(铝、铁、铜)属于其中一个类别每个类别只有一张图片,例如,所有的铝材料不会与铁材料一起出现在同一张照片中。这个模型运行得很好,精度也很高。然而,我不知道如何处理不符合这三个类别中任何一个的图像。假设我提交了一张木头的照片。这显然不适合这三个类别中的任何一个,但我的模型似乎"猜测"了其中一个,并给其中一个随机类别一个假阳性,概率很高。我知道model.predict()的结果不能为零,这是理想的情况。我测试了softmax和sigmoid激活,但都没有效果。我还试图创建一个名为"无"的虚假类别,并用没有任何上述材料的物体的随机照片训练模型。结果是整个模型变得不可靠,失去了我以前的大部分准确性。

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu',
input_shape=(64, 64, 3)))
model.add(Conv2D(64, (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(classes, activation='sigmoid'))
model.compile(loss='binary_crossentropy', 

optimizer='adam',
metrics=['accuracy'])
checkpoint = ModelCheckpoint(filepath='c:/Users/data/models/model-{epoch:02d}-{val_loss:.2f}.hdf5',save_best_only=True)
callbacks_list = [checkpoint] 
model.fit(x_train, y_train,
batch_size=75,
epochs=20,
verbose=1,
validation_data=(x_valid, y_valid), callbacks=[checkpoint])

据我所知,在有监督的学习中,这几乎是不可能的。

监督学习需要一些数据集,让机器学习。然而,属于"无"的类别实在太多了。几乎不可能把所有其他材料都归为"无"。最糟糕的是,监督学习将主要识别所培训的内容。所以当一个全新的东西出现在你的测试中时。系统很可能会忽略或给出基于给定训练的结果之一。

一种更适合应用程序的方法是无监督学习。将无监督学习用于图像分类应该有很多资源和研究。样品纸之一:

https://www.cv-foundation.org/openaccess/content_cvpr_2013/papers/Siva_Looking_Beyond_the_2013_CVPR_paper.pdf

欢迎任何反馈。我被纠正了。谢谢

您需要添加另一个类,以便为与现有标签不匹配的项目添加标签。所以你有铝、铁、铜和非以上

更改您的型号:

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

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

并修改数据,将木材标记为none_of_the_above。你需要很多与铝、铁、铜不匹配的例子。

现在添加自定义精度:

def ignore_accuracy_of_class(class_to_ignore=0):
def ignore_acc(y_true, y_pred):
y_true_class = K.argmax(y_true, axis=-1)
y_pred_class = K.argmax(y_pred, axis=-1)
ignore_mask = K.cast(K.not_equal(y_pred_class, class_to_ignore), 'int32')
matches = K.cast(K.equal(y_true_class, y_pred_class), 'int32') * ignore_mask
accuracy = K.sum(matches) / K.maximum(K.sum(ignore_mask), 1)
return accuracy
return ignore_acc

并将其添加到编译中:

model.compile(loss='binary_crossentropy', 
optimizer='adam',
metrics=['accuracy', ignore_accuracy_of_class(4)])

ignore_accuracy_of_class中的4是要忽略的标签。现在,您既有整个模型的准确性,也只有您选择的铝、铁、铜标签的准确性。

相关内容

最新更新