由于我的硕士研究项目工作,我正在使用 Google 的 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) 零矩阵。Whit this 我提取了向量的前三个条目。然后我可以应用 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 次?