机器学习和生物信息学实验室联盟

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4314|回复: 15
打印 上一主题 下一主题

使用MXNet远程编写卷积神经网络用于多标签分类

[复制链接]
跳转到指定楼层
楼主
发表于 2017-3-14 20:33:05 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
最近试试深度学习能做点什么事情。MXNet是一个与Tensorflow类似的开源深度学习框架,在GPU显存利用率上效率高,比起Tensorflow显著节约显存,并且天生支持分布式深度学习,单机多卡、多机多卡支持丰富,拥有着良好的技术架构。目前是亚马逊AWS的官方深度学习框架。由于其团队以MXNet产品本身为先,所以文档资料较少。现在还稍微多了一点。

1. 搭建Jupyter notebook远程开发环境
Jupyter notebook支持python、R、shell等等,功能非常全面。基于Jupyter notebook,我在实验室的K80 GPUs服务器上搭建MXNet环境(搭建步骤见官网,很简单,131上已装好),然后利用SSH隧道传输,可以随时随地在浏览器里编程,使代码加速运行在K80 GPUs设备上。

Step-by-step教程见博客:http://www.cnblogs.com/shixiangwan/p/6406777.html

此外,Jupyter notebook默认的主题不好看,可以定制更喜欢的编程字体:https://github.com/dunovank/jupyter-themes

2. 卷积神经网络(CNN)

CNN较适合于矩阵特征,例如图像分类,目标检测。生物信息学方面,蛋白质的二级结构预测也有相关paper,牛津出版社的《Deep learning in bioinformatics》叙述很详细(点击看大图):


当然,CNN也是非常基础的,目前还有RNN(递归神经网络),LSTM(长短记忆网络,NLP和speech领域居多),残差网络(更深且快的卷积网络),GAN(生成对抗网络,亦有很多衍生结构)等等,技术更迭非常之快,一个比较好的书籍是《Deep Learning》,Github上有民间中文版。

对于一些多标签分类任务,想方法把特征做成矩阵形式,也可以利用CNN做分类。这里我写了个试验性程序来证明CNN比传统的多层感知机要优秀些。

1. 数据描述:RNA亚细胞定位特征数据。有14489个样本,34维特征,42维标签。
2. 程序试验:数据直接进入CNN肯定过拟合,于是我将每个特征复制34份形成34*34矩阵(这样做是不对的,只是先跑通CNN)。训练集:验证集:测试集=8:1:1,然后接入普通的卷积网络,用测试集看最终结果。
3. 运行过程:https://github.com/ShixiangWan/i ... ics/mxnet-bio.ipynb
4. 源码及数据:https://github.com/ShixiangWan/i ... ster/Bioinformatics
5. 结果描述:准确率96.5%,这个计算方式是14489*0.1*42=60858个测试样本标签中,有58723个分对的。推测:在更复杂的蛋白质二级结构预测方面,卷积神经网络可能有着更好的效果。


程序运行需要(131全都有):
1. MXNet环境
2. Python 2.7环境,numpy包,jupyter包


-----------  2017年4月11日 更新 -----------

今天突然明白了为什么我们序列预测的值都一样了。因为我们的卷积网络全连接前面的输出值就已经基本一样了,那么预测值一样就是肯定的。那么为什么卷积网络全连接前面的输出值基本一样呢?因为我们必须保证卷积的矩阵具有实际的局部数字意义,这也是卷积网络更擅长图片的原因。


其中,σ是激活函数,如sigmod;b是共享偏置,w是共享权重,a是矩阵元素。这即是输入层到隐含层的feature map。卷积矩阵需要有局部数字意义,激活函数才能发挥作用,卷积网络输出值才会有分类效果。黑白图片表示成01矩阵,彩色图片表示成3通道RGB矩阵,它们会形成规范的、有实际局部数字意义的矩阵,如手写数字图片矩阵:



上面矩阵,很明显能看出矩阵具有局部意义,代表手写数字2,这个局部特征能确保sigmod激活函数能够对特征进行正常的赋权重。再看我们随机构造的特征:



上面矩阵几乎让人摸不到头脑,寻找其中的抽象特征也是几乎不可能。而使用序列构造出的特征也没有任何二维局部意义。各个序列长度不同甚至相差巨大,还要有缺省值处理(大量补零等措施)。假设序列样本长度在100~10000,对于很多较短的序列要补充非常多的0且无局部意义,这些操作进一步使得激活函数丧失作用。最后在多次卷积后,每个样本的输出特征几乎一样。

参考资料:http://neuralnetworksanddeeplearning.com/chap6.html

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享
回复

使用道具 举报

15#
 楼主| 发表于 2017-3-28 22:08:18 | 只看该作者
今晚试了试,提取CNN中间层特征还是很方便的,只不过效果不好。

RNA fasta数据进行直接编码,缺省补零,使用lenet卷积网络提取中间层的500维特征,然后将数据处理成平衡数据集(从多类中随机抽取与少类一样多的样本),最终再用WEKA简单跑个10折交叉验证,程序和处理流程,结果都在这里:https://github.com/ShixiangWan/i ... ics/mxnet-bio.ipynb
回复 支持 反对

使用道具 举报

14#
 楼主| 发表于 2017-3-23 22:07:15 | 只看该作者
linwei 发表于 2017-3-17 16:43
赞, 学习下快速实现的能力;
这里有别人整理的深度学习在生物信息学上应用的文章列表, 更新到2017-01, 里面 ...

赞!

我之前也有关注一个深度学习-生物信息学的Github项目:https://github.com/ShixiangWan/deeplearning-biology
回复 支持 反对

使用道具 举报

13#
发表于 2017-3-20 23:11:53 | 只看该作者
zouquan 发表于 2017-3-20 22:58
我们这边结果也一样,根本没有区分能力。
看来深度学习好像只能用它来提点特征,然后和已有的特征混在一 ...

按说,比如蛋白质,序列差异还是很大的,再不济,多些隐层和大点参数规模,让它overfitting,也应该把训练数据记住。但目前状态是,训练半天,它把结果都预测为一样的值,不管训练数据还是测试数据,很奇怪的,感觉还是loss函数选择的不对或其他什么没找对,学习过程没能找到些山坡求梯度,而还在广阔的平原上瞎逛。

点评

是的,我们的结果和你一样,预测的值都一样。等我有时间找个明白人问问。  发表于 2017-3-20 23:45
回复 支持 反对

使用道具 举报

12#
发表于 2017-3-20 22:58:26 | 只看该作者
chunyu 发表于 2017-3-20 22:26
赞,我用keras跑半天结果都是0,蒙圈中

我们这边结果也一样,根本没有区分能力。
看来深度学习好像只能用它来提点特征,然后和已有的特征混在一起,再用svm分类
回复 支持 反对

使用道具 举报

11#
发表于 2017-3-20 22:26:44 | 只看该作者
赞,我用keras跑半天结果都是0,蒙圈中
回复 支持 反对

使用道具 举报

10#
发表于 2017-3-17 16:43:41 | 只看该作者
赞, 学习下快速实现的能力;
这里有别人整理的深度学习在生物信息学上应用的文章列表, 更新到2017-01, 里面有篇CNN + RNN 在蛋白质二级结构预测方面的应用(2016-04 | Protein Secondary Structure Prediction Using Cascaded Convolutional and Recurrent Neural Networks | Zhen Li and Yizhou Yu | Arxiv), 或许可以参考下。
https://github.com/gokceneraslan/awesome-deepbio
回复 支持 反对

使用道具 举报

9#
 楼主| 发表于 2017-3-15 14:37:37 | 只看该作者
RockRabbit 发表于 2017-3-15 12:27
首先,这个工作很赞啊。

有个疑问,你在统计准确率的时候,我看更多像是把它当作多类分类问题进行统计 ...

应该是可以的,自编码,不过我还不太清楚机制,持续研究中,有新的成果再分享给大家~
回复 支持 反对

使用道具 举报

8#
发表于 2017-3-15 12:27:10 | 只看该作者
shixiang 发表于 2017-3-15 10:55
对的,也要提取特征。自然语言处理里面,单词有word2vec等方法提取特征;图片里面可以用RGB值作特征。 ...

首先,这个工作很赞啊。

有个疑问,你在统计准确率的时候,我看更多像是把它当作多类分类问题进行统计,我建议你可以输出absolute accuracy,这样接近多标签的分类结果。

另外,CNN好像有学习特征的功能,不知道能否把最后学习到的特征保存呢?
回复 支持 反对

使用道具 举报

7#
 楼主| 发表于 2017-3-15 10:55:58 | 只看该作者
zouquan 发表于 2017-3-15 01:09
深度学习还是需要提取特征?
我以为直接用序列就可以分类了呢。


对的,也要提取特征。自然语言处理里面,单词有word2vec等方法提取特征;图片里面可以用RGB值作特征。我感觉深度学习很适合处理特征层次很低、样本数上百万上千万的场景,所以尤其适合搞图像,但也有好多生物信息学应用。还有就是调参优化很困难,衍生的网络结构也特别丰富。如果能借鉴一些关于2016年最新的GAN、ResNET(CVPR 2016的最佳论文)这些思想,且能有不错的多标签分类提升,这样的工作还是蛮创新的,在谷歌学术上还没有生信相关工作出现。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

机器学习和生物信息学实验室联盟  

GMT+8, 2024-5-19 23:38 , Processed in 0.074811 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表