本文复现蛋白质磷酸化领域经典论文DeepPhos:《DeepPhos: prediction of protein phosphorylation sites with deep learning》,发表在《Bioinformatics》期刊上,由Fenglin Luo、Minghui Wang、Yu Liu、Xing-Ming Zhao和Ao Li共同撰写。文章提出了一种名为DeepPhos的新型深度学习架构,用于预测蛋白质磷酸化位点。
磷酸化是蛋白质翻译后修饰中研究最广泛的类型,对多种生物过程至关重要。尽管已有多种计算预测方法,但大多数基于特征选择和区分性分类,因此开发一种能够自动揭示蛋白质磷酸化位点复杂模式的新型高精度预测器具有重要意义。
DeepPhos的核心特点是其密集连接的卷积神经网络(DC-CNN)块,这些块通过内部块连接层(Intra-BCL)和块间连接层(Inter-BCL)捕获序列的多重表示,以进行最终的磷酸化预测。与多层卷积神经网络不同,DeepPhos能够自动捕获蛋白质磷酸化位点的关键序列表示,并在不同层次上进行整合。此外,DeepPhos还可以用于从蛋白质激酶组、家族、亚家族到个体激酶水平的激酶特异性预测。
文章中的代码:USTC-HIlab/DeepPhos (github.com)
前情提示:github上上传的代码有很多错误,请耐心看完。本文是使用anaconda配置了一个虚拟环境进行实验,没下anaconda,请移步其他文章。
点进GitHub就是这个图像,点击Clone->Download ZIP,下载代码压缩包。
下载出来是一个命名为DeepPhos-master的文件夹,解压缩就好。
因为之前使用了python比较高的版本根本跑不通代码,所以这里回退一下使用3.6版本。
conda create -n test python=3.6
创建环境后进入即可,环境下载后就是下载第三方的库,repo中给了一个requirement.txt,但没啥用,里面还缺少几个包,这里我建议一个一个安装。
# 不需要版本要求的库
pip install numpy pandas matplotlib scikit-learn
# 需要版本要求的库
pip install keras==2.0.0 tensorflow==1.2
这里选用keras2.0.0和tensorflow1.2一个是因为requirement.txt里面要求keras2.0.0,tensorflow的版本是试出来,2.0以上的版本根本不行,所以要使用源码训练自己的数据,cuda的版本别太高。
环境配置好后不妨上进入predict.py所在路径,python predict.py试一下,这绝对会报错:
Traceback (most recent call last):
File "predict.py", line 20, in
from tensorflow.keras.optimizers import Adam,SGD
ModuleNotFoundError: No module named 'tensorflow.keras'
tensorflow在2.0版本后才会有 'tensorflow.keras',但下了2.0版本,后面会改的更多,建议直接使用目前的1.2版本。这里的解决方法是将 'tensorflow.'去掉即可,记得在model.py里面也改一下。
接下来再运行一下会又出现错误
File "predict.py", line 21, in
from keras.layers.normalization.batch_normalization_v1 import BatchNormalization
ModuleNotFoundError: No module named 'keras.layers.normalization.batch_normalization_v1'; 'keras.layers.normalization' is not a package
是keras里面缺少normalization模块,这个就不是我用低版本tensorflow的锅,它的requirement.txt里面写着keras==2.0.0,我也安装的是这个版本,结果里面没有这个package,可见这个requirement.txt就是乱写。
这个问题的解决方法就很简单,BatchNormalization函数在keras.layers里面。
from keras.layers import BatchNormalization
再运行出现
File "D:\software\anaconda\envs\test\lib\site-packages\keras\engine\topology.py", line 2475, in load_weights
raise ImportError('`load_weights` requires h5py.')
ImportError: `load_weights` requires h5py.
这个是因为没有安装h5py,直接:
pip install h5py
再运行
File "D:\software\anaconda\envs\test\lib\site-packages\keras\engine\topology.py", line 2482, in load_weights
load_weights_from_hdf5_group(f, self.layers)
File "D:\software\anaconda\envs\test\lib\site-packages\keras\engine\topology.py", line 2842, in load_weights_from_hdf5_group
original_keras_version = f.attrs['keras_version'].decode('utf8')
AttributeError: 'str' object has no attribute 'decode'
这又是keras的问题,所以适合这套代码的keras版本根本不是2.0.0,作者瞎写repo,这里的解决方法很原始很暴力,改库函数。
进入D:\software\anaconda\envs\test\lib\site-packages\keras\engine\topology.py文件中
查找decode
会发现有很多处,这个时候就要耐心把这几处的decode前面加上encode,例如:
# 原来代码
original_keras_version = f.attrs['keras_version'].decode('utf8')
# 改后代码
original_keras_version = f.attrs['keras_version'].encode('utf8').decode('utf8')
经过这几处纠错,这样你就能够跑起来这个predict.py文件。
上面只是跑通示例预测代码,但如果你想重新训练一个模型,那么你需要使用train.py这个文件,所以你需要在这个文件里面把导入库的代码再改一下。
修改之后你会发现依旧报错,这就是我说代码写得差的原因:
这是github中展示的train.py文件,我没修改,这低级错误的锅我不背。看train_for_deepphos函数,里面传入一个参数site,再往下看,想使用这个参数时写的什么,是sites。所以这个代码真的很烂,直接降低了中科大大佬在我心里的形象。
希望作者看到这篇文章会去修改代码。