如何通过在tensorflow中使用softmax输出层来并行(在神经网络中)确定多个标签



由于我硕士研究的项目工作,我正在使用谷歌的tensorflow库实现一个神经网络。在这一点上,我想(在前馈神经网络的输出层)并行确定几个标签。作为输出层的激活函数,我想使用softmax函数。所以我想要的是一个向量的输出,它看起来像这样:

vec = [0.1, 0.8, 0.1,   0.3, 0.2, 0.5]

这里,前三个数字是第一分类的三个类别的概率,而其他三个数字则是第二分类的三种类别的概率。所以在这种情况下,我会说标签是:

[ class2 , class3 ]

在第一次尝试中,我试图通过首先用tf.reshape()将(1x6)向量重塑为(2x3)矩阵,然后在矩阵tf.nn.softmax()上应用softmax函数,最后将矩阵重塑为向量来实现这一点。不幸的是,由于整形,梯度下降优化器在计算梯度时遇到了问题,所以我尝试了一些不同的方法。

我现在要做的是,我取(1x6)向量,并将其乘以一个矩阵,该矩阵的上半部分有(3x3)单位矩阵,下半部分有一个(3x3"零矩阵。在这里,我提取向量的前三个条目。然后我可以应用softmax函数,并通过另一个矩阵乘法将其带回(1x6)的旧形式。对于其他三个矢量条目,也必须重复此操作。

outputSoftmax  = tf.nn.softmax( vec * [[1,0,0],[0,1,0],[0,0,1],[0,0,0],[0,0,0],[0,0,0]] ) *  tf.transpose( [[1,0,0],[0,1,0],[0,0,1],[0,0,0],[0,0,0],[0,0,0]] )
               + tf.nn.softmax( vec * [[0,0,0],[0,0,0],[0,0,0],[1,0,0],[0,1,0],[0,0,1]] ) *  tf.transpose( [[0,0,0],[0,0,0],[0,0,0],[1,0,0],[0,1,0],[0,0,1]] )

到目前为止它是有效的,但我不喜欢这个解决方案。因为在我真正的问题中,我不仅要一次确定两个标签,而且91,我必须重复上述程序表91次。

有人有解决方案吗?我如何获得所需的向量,其中softmax函数一次只应用于三个条目,而不需要写91次"相同"的代码?

您可以应用tf.split函数来获得91个张量(每个类一个),然后对每个张量应用softmax。

classes_split = tf.split(0, 91, all_in_one)
for c in classes_split:
    softmax_class = tf.nn.softmax(c)
    # use softmax_class to compute some loss, add it to overall loss

或者,您也可以将它们再次连接在一起,而不是直接计算损失:

classes_split = tf.split(0, 91, all_in_one)
# softmax each split individually
classes_split_softmaxed = [tf.nn.softmax(c) for c in classes_split]
# Concatenate again
all_in_one_softmaxed = tf.concat(0, classes_split_softmaxed)

最新更新