如果输出是一站式矢量,如何自定义深度学习模型?

时间:2019-08-30 09:33:26

标签: tensorflow keras deep-learning

我正在尝试使用TensorFlow和Keras构建深度学习模型。这是用于处理单实例多标签的任务的顺序模型,该任务是Multi-Instance Multi-Label的简化版本。

具体来说,我模型的输入是一个固定长度的数组,因此可以将其表示为这样的向量:

Input

我的模型的输出是一系列字母,这些字母来自具有固定大小的字母。例如,{A,B,C,D}的字母只有4个可能的成员。因此,我可以使用一个热门向量来表示序列中的每个字母。

序列的长度是可变的,但是为了简单起见,我使用固定的长度(等于最长序列的长度)来存储所有序列。

如果序列的长度短于固定长度,则该序列由一个热向量(等于连续实际长度)和零个向量(等于剩余长度)表示。例如, CADB 由4 * 5矩阵表示,如下所示:

Output

请注意:此矩阵的前4列是单热向量,每个向量只有一个且只有一个1项,所有其他项均为0。 但是最后一列的条目全为0,可以将其视为零填充,因为字母序列不够长。

因此,用一个词来说,输入是向量,输出是矩阵。

与上面发布的链接不同,应该将输出矩阵视为一个整体。因此,将一个输入向量分配给整个矩阵,而不分配给该矩阵的行或列。

我的问题是:如何为此特殊输出自定义我的深度学习模型,例如:

  1. 我应该选择或设计哪种损失函数和准确性指标?
  2. 我需要在模型的最后自定义一个特殊层吗?

1 个答案:

答案 0 :(得分:1)

您应该在输出层上使用softmax激活,并将categorical_crossentropy作为损失函数。

但是,如您在上面的链接中看到的那样,问题在于默认情况下这两个函数应用于最后一个轴(axis=-1),而在您所处的情况下,这是第二个最后一个轴(列一矩阵编码)。

要使用右轴,一种选择是定义自己的这些功能的版本,如下所示:

def softmax_columns(x):
    return tf.keras.backend.softmax(x, axis=-2)

def categorical_crossentropy_columns(target, output):
    return tf.keras.backend.categorical_crossentropy(target, output, axis=-2)

然后,您可以像这样使用它们:

model.add(SomeLayer(..., activation=softmax_columns, ...)) # output layer

model.compile(loss=categorical_crossentropy_columns, ...)

一个不错的选择(通常不仅在这里)是在from_logits=True调用中使用categorical_crossentropy。这有效地将softmax内置到损失函数中,因此您的模型本身不再需要(实际上:不必拥有)最终的softmax激活。这不仅节省了工作,而且在数值上更稳定。