我正在尝试使用softmax作为输出函数来训练一个多任务分类神经网络。
这个想法来自论文“超越炒作:深度神经网络优于使用ChEMBL生物活性基准集的既定方法”,其中作者描述了一个具有3个隐藏层(4000,2000,1000)和一个输出层的MT-NN,其节点数量与任务数量相同(即1227)。该数据集由针对不同蛋白质靶标和标签"1“和"0”测试的分子组成,将它们描述为活性/非活性。此外,一个分子可以被归类为在多个目标中具有活性。
在论文中,作者在输出层使用了一个自定义的softmax函数,它给出了每个节点/任务的独立概率,而不是产生一个和为1的概率向量o。这对我来说很奇怪,因为我了解到softmax函数的概率和是1。
下面是他们用lassagna实现的代码:
def custom_softmax(x):
num_groups = num_outputs # number of tasks
probabilities = softmax(x[:, 0:2])
for i in range(2, 2 * num_groups, 2):
p_y_given_x = softmax(x[:, 2 * i:2 * i + 2])
probabilities = T.concatenate([probabilities, p_y_given_x], axis=1)
return probabilities由于他们没有回复我的邮件,我想问一下是否有人能解释一下这个自定义的softmax是做什么的。我天真地认为应该使用sigmoid函数。在我看来,输出层上的每个节点都是独立处理的。
另一件事是我如何在Keras上实现这一点?我测试了上面的函数,当我向它传递张量时,它可以工作,但由于输入的形状错误,训练失败。例如,我的目标变量具有形状(10000,154),但当我使用批量大小128拟合模型时,它会引发错误,并显示预期的形状为(128,78)。
原文:https://link.springer.com/article/10.1186/s13321-017-0232-0
发布于 2020-08-27 02:44:35
Sigmoid函数为每个激活节点提供0-1的激活概率,softmax将通过所有输出的总和给出0-1的激活概率。所以你混合了这两个概念,你的形状不匹配可能是由于softmax形状= 2,(152/2!=78你也有一些关于最后一个小批量大小的索引问题)
https://stackoverflow.com/questions/56333612
复制相似问题