黄老之道分享 http://blog.sciencenet.cn/u/jawa 德光上贤,志照正宗!

博文

准备使用Perl进行深度学习

已有 27475 次阅读 2017-8-22 04:18 |个人分类:人才培养|系统分类:教学心得

大概两年前,看到了Michael Nielsen撰写的一本在线书籍《Neural Networks and Deep Learning》,深入浅出,非常适合入门学习。当时,我把该书第一章相应内容(使用神经网络识别手写数字,Using neural nets to recognize handwritten digits)整合成生物信息学的上机课内容之一,让同学们体验了一下机器学习。遗憾的是,相应平台、库及代码都是基于Python的。对于我这种不思进取的Perl老人来说,非常希望能使用Perl代码来进行深度学习的探索。

半年前,非常高兴地注意到Sergey Kolychev正在给MXNet深度学习框架编写Perl的应用程序编程接口(AI::MXNet)。最新的更新是8月6号,看上去内容已相当丰富,可以用Perl代码通过这个API在MXNet框架上进行深度学习的应用开发了。于是昨天一早去机场送别妻女后,忙活了一天,想把整个平台搭建起来。刚开始想在笔记本上的Windows+Strawberry Perl上面进行,发现困难较大。于是转到服务器上。MXNet官网上有在Ubuntu上安装MXNet框架及其Perl API的详细文档,可是我们的服务器使用的是Gentoo Linux。于是参考该文档,摸索前进。

一、构建MXNet共享库

1. Install build tools and git. 使用apt-get和git。由于服务器已有git和portage,此步省略。

2. Install OpenBLAS. 使用Gentoo Linux的emerge OpenBLAS遇到很多问题。先是木有ebuilds,于是
emerge layman
layman -a science # 又遇到问题,在/etc/portage/make.conf 中加入一句source /var/lib/layman/make.conf解决问题,然后layman -a science然后
emerge sci-libs/openblas #遇到Portage EAPI 5 -> 6 问题,尝试各种方案,花去很多时间,无解。后来发现,服务器自带ATLAS库,省略此步。

3. Install OpenCV. 使用emerge OpenCV。

4. Download MXNet sources and build MXNet core shared library.

git clone --recursive https://github.com/dmlc/mxnet #点赞git,超级好用,克隆到当前目录!

cd mxnet
make -j $(nproc) USE_OPENCV=1 USE_BLAS=atlas # CPU上构建,mxnet/make/config.mk有详细说明。编译时间较长,可喝咖啡。make install不工作,我是手动把编译后mxnet/bin下的im2rec及mxnet/lib下的libmxnet.so和libmxnet.a分别拷贝了一份到系统的bin和lib目录的。最好别make clean,编译很久的东东分分钟消失。中间省略XXX字各种问题。很多可能是我不熟悉的python导致的。以下命令对解决安装中遇到的很多问题管用。

eselect python list
Available Python interpreters:
 [1]   python2.7
 [2]   python3.4 *
eselect python set 1

env-update &&source /etc/profile
emerge -1 blas-reference
emerge -1 lapack-reference
emerge -1 cblas-reference
eselect blas set reference
eselect lapack set reference
eselect cblas set reference

 似乎不少问题是Python2和Python3不兼容导致的,想起来都是泪。同样的麻烦可能未来会见于Perl5和Perl6。

二、Build the Perl package

参考链接,从源代码编译Perl包。

1. 准备工作,Ubuntu上的
sudo apt-get install libmouse-perl pdl cpanminus swig libgraphviz-perl
我在Gentoo Linux上对应为以下命令
emerge dev-perl/Mouse
emerge dev-perl/PDL #这个必须,PDL很牛B
emerge dev-perl/App-cpanminus #总觉得并非必须
emerge dev-lang/swig #必须
emerge dev-perl/GraphViz #必须
中间遇到问题,例如GraphViz,可emerge -atv dev-perl/GraphViz,然后回答Yes,自动修改配置,然后运行etc-update命令,然后回答-5,然后再emerge dev-perl/GraphViz。不少包的安装还需要google找到相应包,编辑/etc/portage/make.conf中相应mirror网址,再快速有效地emerge。

2. 编译Perl包

进入当前目录下git克隆的mxnet文件夹下,把perl-package目录的脚本test.sh拷贝到mxnet文件夹下
cp ./perl-package/test.sh .
运行 ./test.sh

然而并没有安装好,于是手动将mxnet/perl5中AI及auto中相应pm及so文件拷贝到系统的Perl的对应目录,例如我的/usr/lib64/perl5/vendor_perl/5.20.2/auto等。感觉还漏掉了很多模块,于是
cpan
force install AI::MXNet
眼花缭乱~~~

三、测试

下载手写数字识别Perl脚本mnist.pl

该脚本会自动下载mnist数据集,并进行网络构建与训练、测试。代码使用的一些模块及功能,如

use LWP::UserAgent ()
open my($flbl),'<:gzip', download_data($label_url);

服务器还没安装。于是cpan
install LWP
install PerlIO::gzip
最后运行 ./mnist.pl测试。下载数据集需要时间,耐心等待,然后训练、测试。速度相当快,结果惊人
Epoch[0] Batch [200]    Speed: 7940.08 samples/sec      Train-accuracy=0.870100
Epoch[0] Batch [400]    Speed: 8220.64 samples/sec      Train-accuracy=0.942600
Epoch[0] Train-accuracy=0.952613
Epoch[0] Time cost=7.334
Epoch[0] Validation-accuracy=0.955300

Epoch[1] Batch [200]    Speed: 8567.13 samples/sec      Train-accuracy=0.956318
Epoch[1] Batch [400]    Speed: 8593.02 samples/sec      Train-accuracy=0.963300
Epoch[1] Train-accuracy=0.965578
Epoch[1] Time cost=6.971
Epoch[1] Validation-accuracy=0.967200

Epoch[2] Batch [200]    Speed: 8729.67 samples/sec      Train-accuracy=0.965572
Epoch[2] Batch [400]    Speed: 8769.56 samples/sec      Train-accuracy=0.970800
Epoch[2] Train-accuracy=0.973618
Epoch[2] Time cost=6.839
Epoch[2] Validation-accuracy=0.967500
.....

第三轮下来,验证的准确率就高达96.75%了~~~,感觉比Michael Nielsen同样的例子速度更快、准确率要好。接下来就该仔细读代码,看看究竟了。



https://blog.sciencenet.cn/blog-204973-1072152.html

上一篇:欢迎第一志愿报考
下一篇:IJBS专刊:生物学研究中的计算资源与方法
收藏 IP: 104.205.116.*| 热度|

6 彭真明 刘拴宝 陈新 张亮生 陈照强 xiyouxiyou

该博文允许注册用户评论 请点击登录 评论 (5 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-24 17:24

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部