如何在 tensorflow 中为非 class 化对象创建 class?
How to create a class for non classified object in tensorflow?
你好,我已经用两只 classes 狗和猫构建了我的 CNN,我已经训练了它,现在我可以 classify 狗和猫的图像。但是,如果我想为新的未 class 化对象引入 class 怎么办?例如,如果我向我的网络提供花卉图像,网络会给我一个错误的 classification。我想用第三个 class 为新的未 class 化对象构建我的网络。但是我如何构建第三个 class。对于不同于狗或猫的新对象,我必须使用哪些图像来获取 class?
实际上,在我的网络末端,我使用 Softmax,我的代码是使用 tensorflow 开发的。有人可以给我一些建议吗?谢谢
您应该只将既不是狗也不是猫的图像添加到您的数据集中,将它们标记为 "Other"
,并在所有代码中将 "Other"
视为正常 class。特别是您将获得超过 3 classes 的 softmax。
您使用的图像可以是任何图像(当然猫和狗除外),但应该与您在使用网络时可能要测试的图像属于同一类型。因此,例如,如果你知道你将在狗、猫和其他动物的图像上进行测试,请与其他动物一起训练,而不是用鲜花图片。如果您不知道要用什么进行测试,请尝试从不同的来源等获取非常不同的图像,以便网络很好地学习这个 class 是 "anything but cats and dogs"(范围很广现实世界中属于此类别的图像数量应反映在您的训练数据集中)。
您需要添加第三个 "something else" class 到您的网络。有几种方法可以解决这个问题。一般来说,如果你有一个 class 想要检测,你应该有那个 class 的例子,这样你就可以将没有猫或狗的图像添加到你的训练数据中,用新的 class.然而,这有点棘手,因为根据定义,新的 class 是宇宙中除了狗和猫之外的所有东西,所以你不可能指望有足够的数据来训练它。但是在实践中,如果你有足够的例子,网络可能会知道第三个 class 在前两个不触发时被触发。
我过去使用的另一个选项是 "default" class 的模型与常规模型略有不同。因此,与其尝试真正了解什么是 "not cat or dog" 图像,不如明确地说它只是不会激活猫或狗神经元的任何东西。我通过将最后一层从 softmax 替换为 sigmoids 来做到这一点(因此损失将是 sigmoid 交叉熵而不是 softmax 交叉熵,并且输出不再是分类概率分布,但老实说它并没有产生太大影响在我的情况下性能方面的差异),然后将 "default" class 表示为 1 减去每个其他 class 的最大激活值。因此,如果没有 class 有 0.5 或更大的激活(即 50% 的估计概率是 class),"default" class 将是得分最高的。您可以探索其他类似方案。
你好,我已经用两只 classes 狗和猫构建了我的 CNN,我已经训练了它,现在我可以 classify 狗和猫的图像。但是,如果我想为新的未 class 化对象引入 class 怎么办?例如,如果我向我的网络提供花卉图像,网络会给我一个错误的 classification。我想用第三个 class 为新的未 class 化对象构建我的网络。但是我如何构建第三个 class。对于不同于狗或猫的新对象,我必须使用哪些图像来获取 class? 实际上,在我的网络末端,我使用 Softmax,我的代码是使用 tensorflow 开发的。有人可以给我一些建议吗?谢谢
您应该只将既不是狗也不是猫的图像添加到您的数据集中,将它们标记为 "Other"
,并在所有代码中将 "Other"
视为正常 class。特别是您将获得超过 3 classes 的 softmax。
您使用的图像可以是任何图像(当然猫和狗除外),但应该与您在使用网络时可能要测试的图像属于同一类型。因此,例如,如果你知道你将在狗、猫和其他动物的图像上进行测试,请与其他动物一起训练,而不是用鲜花图片。如果您不知道要用什么进行测试,请尝试从不同的来源等获取非常不同的图像,以便网络很好地学习这个 class 是 "anything but cats and dogs"(范围很广现实世界中属于此类别的图像数量应反映在您的训练数据集中)。
您需要添加第三个 "something else" class 到您的网络。有几种方法可以解决这个问题。一般来说,如果你有一个 class 想要检测,你应该有那个 class 的例子,这样你就可以将没有猫或狗的图像添加到你的训练数据中,用新的 class.然而,这有点棘手,因为根据定义,新的 class 是宇宙中除了狗和猫之外的所有东西,所以你不可能指望有足够的数据来训练它。但是在实践中,如果你有足够的例子,网络可能会知道第三个 class 在前两个不触发时被触发。
我过去使用的另一个选项是 "default" class 的模型与常规模型略有不同。因此,与其尝试真正了解什么是 "not cat or dog" 图像,不如明确地说它只是不会激活猫或狗神经元的任何东西。我通过将最后一层从 softmax 替换为 sigmoids 来做到这一点(因此损失将是 sigmoid 交叉熵而不是 softmax 交叉熵,并且输出不再是分类概率分布,但老实说它并没有产生太大影响在我的情况下性能方面的差异),然后将 "default" class 表示为 1 减去每个其他 class 的最大激活值。因此,如果没有 class 有 0.5 或更大的激活(即 50% 的估计概率是 class),"default" class 将是得分最高的。您可以探索其他类似方案。