如何在张量流中为非分类对象创建一个类?
Posted
技术标签:
【中文标题】如何在张量流中为非分类对象创建一个类?【英文标题】:How to create a class for non classified object in tensorflow? 【发布时间】:2018-04-11 07:21:29 【问题描述】:您好,我已经用两类狗和猫构建了我的 CNN,我已经对此进行了训练,现在我可以对狗和猫的图像进行分类。但是如果我想为新的未分类对象引入一个类呢?例如,如果我用花朵图像为网络提供信息,那么网络会给我一个错误的分类。我想为新的未分类对象建立第三类网络。但是我怎样才能建立这个第三类。我必须使用哪些图像来获得与狗或猫不同的新对象的类? 实际上,在我的网络结束时,我使用 Softmax,我的代码是使用 tensorflow 开发的。有人可以给我一些建议吗?谢谢
【问题讨论】:
【参考方案1】:您需要向您的网络添加第三个“其他”类。有几种方法可以解决它。一般来说,如果您有一个要检测的类,则应该有该类的示例,这样您就可以将没有猫或狗的图像添加到用新类标记的训练数据中。然而,这有点棘手,因为根据定义,新类是宇宙中除了狗和猫之外的所有东西,所以你不可能期望有足够的数据来训练它。但是,在实践中,如果您有足够的示例,网络可能会知道当前两个没有时触发第三个。
我过去使用的另一个选项是对“默认”类进行建模,该类与常规类略有不同。因此,与其试图真正了解什么是“不是猫或狗”的图像,你可以明确地说它只是没有激活猫或狗神经元的任何东西。我通过将最后一层从 softmax 替换为 sigmoid 来做到这一点(因此损失将是 sigmoid 交叉熵而不是 softmax 交叉熵,并且输出将不再是分类概率分布,但老实说它并没有多大在我的情况下性能差异),然后将“默认”类表示为 1 减去其他所有类的最大激活值。因此,如果没有类的激活值大于或等于 0.5(即 50% 的估计概率是该类),则“默认”类将是得分最高的类。您可以探索其他类似的方案。
【讨论】:
感谢您的解决方案。首先,我会尝试在我的模型中添加另一个类,并在尝试替换 softmax 层后查看结果。【参考方案2】:您应该在数据集中添加既不是狗也不是猫的图像,将它们标记为"Other"
,并在所有代码中将"Other"
视为普通类。特别是,您将获得超过 3 个类别的 softmax。
您使用的图像可以是任何东西(当然除了猫和狗),但应该与您在使用网络时可能要测试的图像相同。因此,例如,如果您知道您将在狗、猫和其他动物的图像上进行测试,请与其他动物一起训练,而不是花的图片。如果你不知道你将要测试什么,试着从不同的来源等获得非常多样化的图像,这样网络就可以很好地学习到这个类是“除了猫和狗之外的任何东西”(广泛的图像在现实世界中属于此类的应该反映在您的训练数据集中)。
【讨论】:
以上是关于如何在张量流中为非分类对象创建一个类?的主要内容,如果未能解决你的问题,请参考以下文章
我们如何在 TypeScript 中为非全局接口创建扩展方法?