我目前正在处理TensorFlow的分类问题,我是机器学习世界的新手,但我没有得到任何东西。
我已经成功尝试训练像这样输出y
张量的模型:
y = [0,0,1,0]
,但我无法理解其背后的校长...
为什么不只是训练相同的型号为y = 3
或y = 4
这似乎更加灵活,因为我可以想象有200万个可能的类有多个分类的问题,并且输出数字在0-2,000,000之间的效率要高得多,而不是输出每一个张量的张量结果。
我缺少什么?
理想情况下,您可以训练模型以对输入实例进行分类并产生单个输出。像
y=1
表示input=dog
,y=2
表示input=airplane
。但是,这种方法带来了很多问题:
- 如何解释输出
y=1.5
? - 为什么我尝试回归当我使用离散数据时,我正在使用连续数据的数字?
实际上,您在做什么,就是将多级分类问题像回归问题一样。这是当地错误的(除非您进行二进制分类,否则在这种情况下,正是您需要的一切(。
为避免这些(和其他(问题,我们使用了最终的神经元层,并将高激活与正确的类相关联。
单速编码表示您想在存在某个输入时迫使网络具有单个高激活输出的事实。
这个,每个input=dog
都将具有1, 0, 0
作为输出等。
以这种方式,您可以正确处理离散的分类问题,产生离散输出且可解释的(实际上,即使您的网络尚未学会,您始终始终使用tf.argmax
提取最高激活的输出神经元为了产生完美的单热编码,您可以毫无疑问地提取最可能的输出(
答案在于如何计算最终张量或单个值。在NN中,您的y=3
将通过加权和上一层的值构建。
尝试训练单个值将意味着不存在的类别ID之间存在线性关系:对于真实值y=4
,即使类别是随机的,并且可以是1: dogs, 3: cars, 4: cats
<,则输出y=3
也会比y=1
更好。/p>
神经网络使用梯度下降来优化损失函数。反过来,此损失函数必须可区分。
对于分类网络而言,离散输出将是(实际上(是一个完全有效且有价值的输出。问题是,我们不知道如何有效地优化此网络。
相反,我们依靠连续的损失函数。此损耗函数通常基于与每个标签概率或多或少相关的事物 - 为此,您需要一个网络输出,每个标签具有一个值。
通常,您描述的输出是通过摄取这些伪探针的argmax来从这种柔软的连续输出中推导的。