我理解CNN如何用于分类问题,例如在MNIST数据集上,其中每个图像代表一个手写数字。评估图像,并给予分类一些信心。
我想知道如果我想在一张图片中识别出几个对象,我会采取什么方法,并对每个图像都有信心。例如 - 如果我评估一只猫和一只狗的图像,我想对'猫'和'狗'都有很高的信心。我不在乎图片中对象的位置。
我目前的知识将引导我构建包含JUST狗的图像数据集,以及包含JUST猫的图像数据集。我会重新训练最高级别的Inception V3网络,它可以识别哪些图像是猫,哪些图像是狗。
问题在于评估狗和猫的图像将导致50%的狗和50%的猫 - 因为它试图对图像进行分类,但我想“标记”图像(理想情况下达到~100%的狗,~100%的猫)。
我简要介绍了基于地区的CNN ,它解决了类似的问题,但我并不关心图片中的对象是什么 - 只是他们每个人都可以被识别出来。
有什么方法可以解决这个问题?我想用Python中的Tensorflow或Keras来实现这一点。
答案 0 :(得分:2)
首先,为了容易理解,只要认为你有两个独立的神经网络,一个只识别猫是否在图像中,另一个识别狗是否是狗,神经元肯定会学会如何识别它。
但更有趣的是,这2个网络可以组合成单个网络来共享权重,并且将狗和猫的 2个输出组合在一起。要做到这一点,你需要注意:
[cat_label, dog label] ={[0, 0], [0, 1], [1, 0], [1, 1]}
。不像MNIST或普通分类模型[cat_label, dog label] ={[0, 1], [1, 0]}
(one_hot标签)。if y_cat>0.5 and y_dog>0.5
,然后猫和狗出现在图像中。希望这有帮助!
答案 1 :(得分:1)
我知道这是一个古老的问题,但是如果它出现在Google搜索其他任何人的首页上(就像对我一样),我想我可以通过一些有用的东西来搞定。
InceptionV3的最后一层是Softmax函数,它试图说这是标签A 或标签B。
但是,如果您要修改诸如Inception之类的标签进行多标签分类,而不是将Softmax用于最后一层,则希望将其换成Sigmoid之类的标签,以便每个标签根据其优点进行衡量(而不是与其邻居进行比较。
有关此原因的更多信息(以及有关如何修改retrain.py
的完整说明),可以在这里找到:
https://towardsdatascience.com/multi-label-image-classification-with-inception-net-cbb2ee538e30
add_final_training_ops()方法最初添加了一个新的softmax和完全连接的层进行训练。我们只需要用另一种替换softmax函数即可。
为什么?
softmax函数将向量的所有值都压缩到[0,1]的范围内,总和为1。这正是我们在单标签分类中所需要的。但是对于我们的多标签案例,我们希望我们得出的类别概率能够表示汽车图像属于概率为90%的类别汽车,而属于概率为30%的类别事故等。我们将通过使用例如S型函数。具体来说,我们将替换为:
final_tensor = tf.nn.softmax(logits,name = final_tensor_name)
具有:
final_tensor = tf.nn.sigmoid(logits,name = final_tensor_name)
我们还必须更新交叉熵的计算方式,以正确训练我们的网络:
再次,只需将Sigmoid替换为softmax:
cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(logits,ground_truth_input)