【发布时间】:2018-01-11 08:02:37
【问题描述】:
假设我已经针对特定对象训练了一个分类器,比如汤姆克鲁斯的脸。如果我随后将自己的面部图像输入它,有没有办法查看分类器的表示和它被测试的图像之间的差异?
(哪个库/语言不是很重要,但让我们假设 TensorFlow。)
【问题讨论】:
标签: tensorflow computer-vision classification
假设我已经针对特定对象训练了一个分类器,比如汤姆克鲁斯的脸。如果我随后将自己的面部图像输入它,有没有办法查看分类器的表示和它被测试的图像之间的差异?
(哪个库/语言不是很重要,但让我们假设 TensorFlow。)
【问题讨论】:
标签: tensorflow computer-vision classification
您可以通过多种方式在这里定义“差异”,这可能会导致不同的解决方案。一个简单的方法可能是在分类之前查看网络中的最后一个特征向量,并将其与汤姆克鲁斯面部的某种“理想”特征向量进行比较(尽管您可能必须对该向量进行某种归一化以及因此值不会无限增长)。然后你会有一些向量差异。
不过,我猜您真正想要的是看到图像形式的差异。但同样,您如何定义“差异”可能是一个问题。我怀疑显示差异的好方法是显示图像中应该更改的内容,使其看起来更像汤姆克鲁斯。这实际上是“深度梦想”网络(部分)的内容。这个想法是你计算梯度,但不是查看权重的梯度,而是查看输入的梯度。如果您在该方向更改图像,这些值将帮助您生成看起来更像您的目标类的图像。就好像您的训练被用于更新图像而不是网络的值(在您已经拥有经过训练的网络之后)。
this short video 进行到一半多一点,您会看到与我建议的内容相似的内容。它们显示了图像应该发生什么变化,以便网络对给定图像做出更强烈的反应。
【讨论】:
tf.gradients。同样,通常这个(或更高级别的函数)用于计算权重的梯度,但在这里,您希望将其用于图像本身的变化。还有更多细节可以完成这项工作,但希望这能让您找到正确的方向!