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

标题: 使用MXNet远程编写卷积神经网络用于多标签分类 [打印本页]

作者: shixiang    时间: 2017-3-14 20:33
标题: 使用MXNet远程编写卷积神经网络用于多标签分类
最近试试深度学习能做点什么事情。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》叙述很详细(点击看大图):
[attach]3438[/attach]

当然,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日 更新 -----------

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

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

[attach]3451[/attach]

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

[attach]3452[/attach]

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

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


作者: zouquan    时间: 2017-3-14 21:18
赞啊,之前那个RNA亚细胞定位效果不好的数据集可以试试啊

另外,蛋白质序列转化成矩阵的代码邢鹏威有。
作者: shixiang    时间: 2017-3-14 21:24
zouquan 发表于 2017-3-14 21:18
赞啊,之前那个RNA亚细胞定位效果不好的数据集可以试试啊

另外,蛋白质序列转化成矩阵的代码邢鹏威有。

回老师,这个就是那个RNA亚细胞定位数据集,效果竟然这么好,我再分析分析这是为啥。
作者: zouquan    时间: 2017-3-14 22:45
shixiang 发表于 2017-3-14 21:24
回老师,这个就是那个RNA亚细胞定位数据集,效果竟然这么好,我再分析分析这是为啥。

你用的是CD-HIT之前的还是之后的?如果是之前的,我记得正常方法效果也好。
另外,我记得CD-HIT之后的二类分类(细胞核内,核外),之前效果也不好
作者: shixiang    时间: 2017-3-14 23:34
zouquan 发表于 2017-3-14 22:45
你用的是CD-HIT之前的还是之后的?如果是之前的,我记得正常方法效果也好。
另外,我记得CD-HIT之后的二 ...

这是CD-HIT之后的数据,pseinone中的sc-general方法提取的特征。回头我试试鹏威那个转矩阵的代码效果怎样~
作者: zouquan    时间: 2017-3-15 01:09
shixiang 发表于 2017-3-14 23:34
这是CD-HIT之后的数据,pseinone中的sc-general方法提取的特征。回头我试试鹏威那个转矩阵的代码效果怎样 ...

深度学习还是需要提取特征?
我以为直接用序列就可以分类了呢。
作者: shixiang    时间: 2017-3-15 10:55
zouquan 发表于 2017-3-15 01:09
深度学习还是需要提取特征?
我以为直接用序列就可以分类了呢。


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

首先,这个工作很赞啊。

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

另外,CNN好像有学习特征的功能,不知道能否把最后学习到的特征保存呢?
作者: shixiang    时间: 2017-3-15 14:37
RockRabbit 发表于 2017-3-15 12:27
首先,这个工作很赞啊。

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

应该是可以的,自编码,不过我还不太清楚机制,持续研究中,有新的成果再分享给大家~
作者: linwei    时间: 2017-3-17 16:43
赞, 学习下快速实现的能力;
这里有别人整理的深度学习在生物信息学上应用的文章列表, 更新到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
作者: chunyu    时间: 2017-3-20 22:26
赞,我用keras跑半天结果都是0,蒙圈中
作者: zouquan    时间: 2017-3-20 22:58
chunyu 发表于 2017-3-20 22:26
赞,我用keras跑半天结果都是0,蒙圈中

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

按说,比如蛋白质,序列差异还是很大的,再不济,多些隐层和大点参数规模,让它overfitting,也应该把训练数据记住。但目前状态是,训练半天,它把结果都预测为一样的值,不管训练数据还是测试数据,很奇怪的,感觉还是loss函数选择的不对或其他什么没找对,学习过程没能找到些山坡求梯度,而还在广阔的平原上瞎逛。
作者: shixiang    时间: 2017-3-23 22:07
linwei 发表于 2017-3-17 16:43
赞, 学习下快速实现的能力;
这里有别人整理的深度学习在生物信息学上应用的文章列表, 更新到2017-01, 里面 ...

赞!

我之前也有关注一个深度学习-生物信息学的Github项目:https://github.com/ShixiangWan/deeplearning-biology
作者: shixiang    时间: 2017-3-28 22:08
今晚试了试,提取CNN中间层特征还是很方便的,只不过效果不好。

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




欢迎光临 机器学习和生物信息学实验室联盟 (http://123.57.240.48/) Powered by Discuz! X3.2