如何在tensorflow中为未分类对象创建类



嗨,我已经用狗和猫两个类构建了我的CNN,我已经训练过了,现在我能够对狗和猫的图像进行分类。但是,如果我想为新的未分类对象引入一个类,该怎么办?例如,如果我给我的网络提供一个花的图像,网络会给我一个错误的分类。我想用第三个类为新的未分类对象构建我的网络。但是我怎样才能建造第三类呢。我必须使用哪些图像来获得与狗或猫不同的新对象的类?事实上,在我的网络末端,我使用Softmax,我的代码是通过使用tensorflow开发的。有人能给我一些建议吗?感谢

您需要在网络中添加第三个"其他东西"类。有几种方法可以做到这一点。一般来说,如果你有一个想要检测的类,你应该有该类的例子,这样你就可以在用新类标记的训练数据中添加没有猫或狗的图像。然而,这有点棘手,因为根据定义,新类是宇宙中除了猫和狗之外的一切,所以你不可能期望有足够的数据来训练它。不过,在实践中,如果你有足够的例子,网络可能会了解到,只要前两个没有,第三个类就会被触发。

我过去使用的另一个选项是对"默认"类进行建模,该类与常规类略有不同。因此,与其试图真正了解什么是"不是猫或狗"的图像,你可以明确地说,这只是没有激活猫或狗神经元的东西。我通过将最后一层从softmax替换为sigmoids来做到这一点(因此损失将是sigmoid交叉熵,而不是softmax交叉熵,输出将不再是分类概率分布,但老实说,在我的情况下,它在性能方面没有太大差异),然后将"默认"类表示为1减去其他类的最大激活值。因此,如果没有一个类别的激活率为0.5或更高(即,该类别的估计概率为50%),那么"默认"类别将是得分最高的类别。你可以探索其他类似的方案。

您应该将既不是狗也不是猫的图像添加到数据集中,将它们标记为"Other",并在所有代码中将"Other"视为普通类。特别是,你将获得超过3个等级的softmax。

你使用的图像可以是任何东西(当然除了猫和狗),但应该与你在使用网络时可能要测试的图像相同。例如,如果你知道你要测试狗、猫和其他动物的照片,就和其他动物一起训练,而不是花的照片。如果你不知道你要用什么来测试,试着从不同的来源获得各种各样的图像,等等,这样网络就可以很好地了解到这个类"不是猫和狗"(现实世界中属于这一类的广泛图像应该反映在你的训练数据集中)。

最新更新