【发布时间】:2019-08-30 09:33:26
【问题描述】:
我正在尝试使用 TensorFlow 和 Keras 构建深度学习模型。这是单例多标签任务的顺序模型,是Multi-Instance Multi-Label的简化版。
具体来说,我的模型的输入是一个固定长度的数组,所以可以这样表示为一个向量:
我的模型的输出是一个字母序列,它们来自一个固定大小的字母表。例如,{A,B,C,D} 的字母表只有 4 个可能的成员。所以我可以使用 one-hot 向量来表示序列中的每个字母。
序列的长度是可变的,但为了简单起见,我使用固定长度(等于最长序列的长度)来存储所有序列。
如果序列的长度小于固定长度,则该序列由 one-hot 向量(等于序列的实际长度)和零向量(等于剩余长度)表示。例如,CADB 用 4 * 5 矩阵表示,如下所示:
请注意:这个矩阵的前 4 列是 one-hot 向量,每个向量都有一个且只有一个 1 条目,其他所有条目都是 0。 但是最后一列的条目都是0,可以看作是补零,因为字母序列不够长。
所以一句话,输入是一个向量,输出是一个矩阵。
与上面发布的链接不同,输出矩阵应该被视为一个整体。因此,一个输入向量被分配给整个矩阵,而不是该矩阵的一行或一列。
我的问题是:如何为这个特殊的输出定制我的深度学习模型,例如:
- 我应该选择或设计什么损失函数和准确度指标?
- 我是否需要在模型的最后自定义一个特殊层?
【问题讨论】:
-
是什么让您认为这是一种不常见的情况?事实上,这可能是最常见的情况之一,并且有很多例子。简而言之:您需要在输出层激活
softmax,并将categorical_crossentropy作为损失函数。 -
嗨 sebrockm,非常感谢您的专业回复。实际上,我已经尝试训练我的模型,并通过测试数据集获得了很好的预测性能(损失接近 0,准确率超过 0.9)。但是当我输出结果时,我发现标签的预测完全不同。显然,结果很糟糕,尽管损失和准确率看起来很不错。这让我觉得我的模型与传统模型不同,也许我应该为我的模型使用一些新设计。
-
那么您对数据的解释有问题。如此好的损失和准确性不会导致完全不同的标签除非您对数据的解释不正确。例如,确保不要混淆列和行的角色。您发布的链接说,一个实例可以有多个标签分配给它。这与您对单热向量的描述相矛盾。那么,也许不是一列,而是矩阵的一行对实例的标签进行编码?
-
我上面贴的链接是一篇关于多实例多标签任务的论文。但是我的模型是针对单实例多标签任务的,比较简单。在我的模型中,一个实例(一个输入向量)被分配给整个矩阵,而不仅仅是一列或一行。实际上,输出是一个整体,但它只能用一组 one-hot 向量表示,因为它是一个字母序列(看起来像一组标签)。
-
好的,我知道了。您也许应该稍微改一下您的问题以更清楚地指出这一点。我会提交答案。
标签: tensorflow keras deep-learning