具有softmax功能的多任务分类

时间:2019-05-28 00:05:01

标签: tensorflow keras deep-learning softmax

我正在尝试使用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

1 个答案:

答案 0 :(得分:0)

Sigmoid函数为每个激活节点提供0-1的激活概率,其中softmax将通过所有输出的总和为0-1的激活概率。因此,您在混合这两个概念时,形状不匹配可能是由于softmax shape = 2,(152/2!= 78,最后一个最小批处理尺寸也存在一些索引问题)