使用Mindspore 0.3运行lstm_aclImdb
这个周末参加了华为mindspore社区举办的Mindspore集训营第二期的活动。
这一期的内容为:
MindSpore的WASM与Rust实验
基于eBPF的AI_Kernel观测
轻松使用Volcano和Kubeflow进行分布式部署
MindSpore_QuickStart之LSTM讲解_LSTM
MindSpore二阶优化详解_二阶优化
一共有3个作业,基本上跟着教程一步一步来都能完成
Mindspore 0.3.0也在这期间发布了。
安装Mindspore 0.3.0的步骤可以参考https://www.https://www.mindspore.cn/install/
这个页面中根据自己实际情况选择,然后复制安装命令到终端中去运行即可
下面通过流水账形式把整个过程讲述一下这一期训练营其中的一个作业:
使用Mindspore 0.3运行lstm_aclImdb
第一步:通过git 把mindspore 拷贝到本地运行
git clone https://gitee.com/mindspore/mindspore
第二步:进入到example/lstm_aclImdb 文件夹
cd mindspore/example/lstm_aclImdb/
第三步:下载数据文件
这一次实验主要会用到两个数据:allmdb_v1和GloVe.6B.
这两个数据的下载地址如下:
http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz
http://nlp.stanford.edu/data/glove.6B.zip
第四步:将数据文件解压到lstm_aclImdb文件夹中
glove.6B.zip:
unzip glove.6B.zip -d ./glove
文件夹结构如下
glove
├── glove.6B.100d.txt
├── glove.6B.200d.txt
├── glove.6B.300d.txt # we will use this one later.
└── glove.6B.50d.txt
aclImdb_v1.tar.gz:
tar -xvzf aclImdb_v1.tar.gz
文件结构如下:
allmdb
├── train # train dataset
└── test # infer dataset
第五步:安装gensim
通过pip install gensim 命令安装gensim
第六步:执行程序
如果直接去执行训练程序train.py
python train.py --preprocess=true --aclimdb_path=./aclImdb --glove_path=./glove --ckpt_path=./ckpt
会出现以下错误:
============== Starting Data Pre-processing ==============
Traceback (most recent call last):
File "train.py", line 55, in <module>
convert_to_mindrecord(cfg.embed_size, args.aclimdb_path, args.preprocess_path, args.glove_path)
File "/root/mindspore/example/lstm_aclImdb/dataset.py", line 82, in convert_to_mindrecord
parser.parse()
File "/root/mindspore/example/lstm_aclImdb/imdb.py", line 51, in parse
self.__wvmodel = gensim.models.KeyedVectors.load_word2vec_format(self.__glove_file)
File "/root/miniconda3/envs/myconda/lib/python3.7/site-packages/gensim/models/keyedvectors.py", line 1498, in load_word2vec_format
limit=limit, datatype=datatype)
File "/root/miniconda3/envs/myconda/lib/python3.7/site-packages/gensim/models/utils_any2vec.py", line 344, in _load_word2vec_format
vocab_size, vector_size = (int(x) for x in header.split()) # throws for invalid file format
File "/root/miniconda3/envs/myconda/lib/python3.7/site-packages/gensim/models/utils_any2vec.py", line 344, in <genexpr>
vocab_size, vector_size = (int(x) for x in header.split()) # throws for invalid file format
ValueError: invalid literal for int() with base 10: 'the'
应该是glove.6B.300d.txt文件需要重新过一下,这个问题我采取的方法是
python -m gensim.scripts.glove2word2vec --input ./glove/glove.6B.300d.txt --output ./glove/glove.6B.300d.w2vformat.txt
随后通过两个命令
mv glove/glove.6B.300d.txt glove/glove.6B.300d.txt.bak
mv glove/glove.6B.300d.w2vformat.txt glove/glove.6B.300d.txt
将原来的文件备份为 glove/glove.6B.300d.txt.bak,将转换后的文件重命名为glove.6B.300d.txt
执行训练程序train.py
python train.py --preprocess=true --aclimdb_path=./aclImdb --glove_path=./glove --ckpt_path=./ckpt
现在就可以看到程序开始正常运行预处理了

程序正在进行预处理,稍微等待一会后就会看见程序开始训练了

config.py文件中定义的epoch为20,所以需要迭代20次,慢慢等待即可。

看到 Train Sucess出来说明训练完成了。下面我们去文件夹下ckpt目录下看看生成的checkpoint文件

第七步:执行验证程序eval.py
这边我们选择最近的一个epoch,也就是第20个epoch进行验证.
python eval.py --ckpt_path=./ckpt/lstm-20_390.ckpt
验证结果:0.8406650641025641

至此,整个lstm_aclImdb计算运行完了,有兴趣的可以更改不同的ckpt文件看看不同的ckpt文件的结果。整个运行过程记录可能存在有不对的地方,欢迎指出和批评。