我正在尝试使用TensorFlow和Keras构建深度学习模型。这是用于处理单实例多标签的任务的顺序模型,该任务是Multi-Instance Multi-Label的简化版本。
具体来说,我模型的输入是一个固定长度的数组,因此可以将其表示为这样的向量:
我的模型的输出是一系列字母,这些字母来自具有固定大小的字母。例如,{A,B,C,D}的字母只有4个可能的成员。因此,我可以使用一个热门向量来表示序列中的每个字母。
序列的长度是可变的,但是为了简单起见,我使用固定的长度(等于最长序列的长度)来存储所有序列。
如果序列的长度短于固定长度,则该序列由一个热向量(等于连续实际长度)和零个向量(等于剩余长度)表示。例如, CADB 由4 * 5矩阵表示,如下所示:
请注意:此矩阵的前4列是单热向量,每个向量只有一个且只有一个1项,所有其他项均为0。 但是最后一列的条目全为0,可以将其视为零填充,因为字母序列不够长。
因此,用一个词来说,输入是向量,输出是矩阵。
与上面发布的链接不同,应该将输出矩阵视为一个整体。因此,将一个输入向量分配给整个矩阵,而不分配给该矩阵的行或列。
我的问题是:如何为此特殊输出自定义我的深度学习模型,例如:
答案 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激活。这不仅节省了工作,而且在数值上更稳定。