我正在尝试使用softmax作为输出函数来训练多任务分类神经网络。
这个想法来自论文“超越炒作:深度神经网络优于使用ChEMBL生物活性基准集的既定方法”,其中作者描述了具有3个隐藏层([4000,2000,1000])的MT-NN。一个输出层,其节点数与任务数相同(即1227)。数据集由针对不同蛋白质靶标测试的分子组成,标记“ 1”和“ 0”将其描述为有活性/无活性。此外,一个分子可以在一个以上的靶标中被分类为活性分子。
在本文中,作者在输出层上使用了自定义softmax函数,该函数没有产生总和为1的向量o概率,而是为每个节点/任务提供了独立概率。这对我来说很奇怪,因为我知道softmax函数的概率之和为1。
这是他们在lassagna中实现的代码:
// *** /routes/index.js file ***
const express = require('express')
const Router = express.Router
const router = Router()
const glob = require('glob')
/**
* options ignore files inside routes folder
*/
const options = {
ignore: [`${__dirname}/_helpers.js`, `${__dirname}/index.js`]
}
/**
* read all files on current directory and export routes as lowercase of the filename
* example 'routes/Products.js' route will be access by '/products'
*/
const routes =
glob.sync(__dirname + '/*.js', options)
.map(filename => {
const arr = filename.split('/')
let name = arr.pop();
name = name.replace('.js', '')
return {
path: `/${name.toLowerCase()}`,
router: require(`${filename.replace('.js', '')}`)
}
})
.filter(obj => Object.getPrototypeOf(obj.router) == Router)
.forEach(obj => router.use(obj.path, obj.router))
module.exports = router;
由于他们没有回复我的电子邮件,所以我想问问是否有人可以向我解释这个自定义softmax在做什么。我天真的认为应该使用S型函数。在我看来,输出层上的每个节点都被独立对待。
另一件事是如何在Keras上实现呢?我测试了上面的函数,当我将张量传递给它时,它可以工作,但是由于输入形状错误而导致训练失败。例如,我的目标变量的形状为(10000,154),但是当我使用批处理大小为128的模型拟合时,它会上升,并且错误地指出它期望的形状为(128,78)。
原始文件:https://link.springer.com/article/10.1186/s13321-017-0232-0
答案 0 :(得分:0)
Sigmoid函数为每个激活节点提供0-1的激活概率,其中softmax将通过所有输出的总和为0-1的激活概率。因此,您在混合这两个概念时,形状不匹配可能是由于softmax shape = 2,(152/2!= 78,最后一个最小批处理尺寸也存在一些索引问题)