当前位置:  开发笔记 > 人工智能 > 正文

如何通过在张量流中使用softmax-output层并行(在神经网络中)确定多个标签?

如何解决《如何通过在张量流中使用softmax-output层并行(在神经网络中)确定多个标签?》经验,为你挑选了1个好方法。

由于我的硕士研究的项目工作,我正在使用谷歌的tensorflow库实现神经网络.在那,我想确定(在我的前馈神经网络的输出层)并行的几个标签.并且作为输出层的激活功能,我想使用softmax功能.所以我想要具体的是输出是一个看起来像这样的Vector:

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

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

[ class2 , class3 ]

在第一次尝试中,我尝试通过首先使用tf.reshape()将(1x6)向量重新整形为(2x3)矩阵来实现此功能,然后在矩阵tf.nn.softmax()上应用softmax函数,最后重新整形矩阵回到矢量.不幸的是,由于重塑,Gradient-Descent-Optimizer在计算渐变时出现问题,所以我尝试了不同的东西.

我现在做的是,我取(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次?



1> panmari..:

您可以应用该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)

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有