如何在Keras模型中创建“无以上”标签

时间:2017-11-10 02:46:59

标签: tensorflow keras classification

我正在进行简单的图像分类。每个物体必须根据其材料(铝,铁,铜)属于其中一个类别 每个班级只有一张图片,例如例如,所有铝材料不与铁材料一起出现在同一张照片中。该模型运行良好,准确性很好。但是我不知道如何处理不适合这三个类别的图像。假设我提交了一块木头的照片。这个不经意地不适合3个类别中的任何一个,但我的模型似乎“猜测”其中一个,并给出这些随机类别之一的假阳性以及高概率。我理解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])

2 个答案:

答案 0 :(得分:0)

您需要添加另一个类,该类将标记与现有标签不匹配的项目。所以你有铝,铁,铜和none_of_the_above

在线更改模型:

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

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

并修改您的数据以将wood标记为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是要忽略的标签。现在,您既拥有整个模型的准确性,也拥有仅所选的铝,铁,铜标签的准确性。

答案 1 :(得分:-1)

根据我的理解,这在监督学习中几乎是不可能的。

监督学习需要一些数据集,让机器学习。但是,属于“无”的类别太多了。几乎不可能涵盖无类别下的所有其他材料。最糟糕的是,有监督的学习将主要认识到所训练的内容。所以当你的测试中出现一些全新的东西时。很可能,系统会根据给定的训练忽略或给出一个结果。

一种更适合您应用的方法是无监督学习。使用无监督学习进行图像分类应该有很多资源和研究。其中一份样本文件:

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

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