2015年6月19日星期五
linux下安装swipl
1) 下载 swipl
http://www.swi-prolog.org/download/stable
2) 安装 swipl
根据INSTALL文件中的提示, 进行
cp build.templ build
build
./build
出现以下错误:
pl-arith.c文件中关于mp_bitcnt_t一系列的错误信息.
解决办法:
1) 安装gmp, https://gmplib.org/#DOWNLOAD
下载gmp-6.0.0a.tar.bz2 (使用较早版本gmp-4.3.2仍然会出现以上错误).
安装(到自定义路径./configure --prefix=/home/***/local)
2) 回到swipl, 修改build文件, 设置, 这样可以找到上一步安装的gmp
export CIFLAGS="-I/home/***/local/include"
export LDFLAGS="-O2 -g -L/home/***/local/lib"
2015年6月9日星期二
nplm代码学习与使用 (3)
模型的训练.
model类 (model.h)中定义了如下的成员变量
Input_word_embeddings input_layer;
Linear_layer first_hidden_linear;
Activation_function first_hidden_activation;
Linear_layer second_hidden_linear;
Activation_function second_hidden_activation;
Output_word_embeddings output_layer;
Matrix<double,Dynamic,Dynamic,Eigen::RowMajor> output_embedding_matrix,
input_embedding_matrix,
input_and_output_embedding_matrix;
activation_function_type activation_function;
int ngram_size, input_vocab_size, output_vocab_size, input_embedding_dimension, num_hidden, output_embedding_dimension;
bool premultiplied;
model定义了两个构造方法,在trainNeuralNetWork.cpp中调用的是这个:
model() : ngram_size(1),
premultiplied(false),
activation_function(Rectifier),
output_embedding_matrix(Matrix<double,Dynamic,Dynamic,Eigen::RowMajor>()),
input_embedding_matrix(Matrix<double,Dynamic,Dynamic,Eigen::RowMajor>())
{
output_layer.set_W(&output_embedding_matrix);
input_layer.set_W(&input_embedding_matrix);
}
接着会调用下面代码对其中一些成员变量初始化.
nn.resize(myParam.ngram_size, myParam.input_vocab_size,
myParam.output_vocab_size, myParam.input_embedding_dimension,
myParam.num_hidden, myParam.output_embedding_dimension);
nn.initialize(rng, myParam.init_normal, myParam.init_range,
-log(myParam.output_vocab_size), myParam.parameter_update,
myParam.adagrad_epsilon);
nn.set_activation_function(
string_to_activation_function(myParam.activation_function));
其中resize方法
2015年6月5日星期五
nplm代码学习与使用 (2)
TrainNeuralNetWork main() 运行流程
参数:
--train_file /home/li***/workspace/nplm/example/work/train.ngrams --validation_file /home/li***/workspace/nplm/example/work/validation.ngrams --num_epochs 10 --words_file /home/li***/workspace/nplm/example/work/words --model_prefix /home/li***/workspace/nplm/example/work/inferno.nnlm --learning_rate 1 --minibatch_size 8
1) 读取并获取各参数
2) 读取训练数据
3) 读取校正数据
4) 读取输入单词/和输出单词文件
5)
参数:
--train_file /home/li***/workspace/nplm/example/work/train.ngrams --validation_file /home/li***/workspace/nplm/example/work/validation.ngrams --num_epochs 10 --words_file /home/li***/workspace/nplm/example/work/words --model_prefix /home/li***/workspace/nplm/example/work/inferno.nnlm --learning_rate 1 --minibatch_size 8
1) 读取并获取各参数
2) 读取训练数据
// Read training data
vector<int> training_data_flat;
vec * training_data_flat_mmap;
data_size_t training_data_size; //num_tokens;
ip::managed_mapped_file mmap_file;
if (use_mmap_file == false) {
cerr << "Reading data from regular text file " << endl;
readDataFile(myParam.train_file, myParam.ngram_size, training_data_flat,
myParam.minibatch_size);
training_data_size = training_data_flat.size() / myParam.ngram_size;
}
readDataFile()方法会读取train.ngrams中所有的数据, 并放入到vector training_data_flat中, 即training_data_flat[0 ~ 2]为第一个ngram (这里ngram = 3-gram), training_data_flat[3~ 5]为第二个ngram, 依此类推. Matrix<int, Dynamic, Dynamic> training_data;
//(training_data_flat.data(), myParam.ngram_size, training_data_size);
#ifdef MAP
cerr<<"Setting up eigen map"<<endl;
if (use_mmap_file == false) {
training_data = Map< Matrix<int,Dynamic,Dynamic> >(training_data_flat.data(), myParam.ngram_size, training_data_size);
} else {
training_data = Map< Matrix<int,Dynamic,Dynamic> >(training_data_flat_mmap->data().get(), myParam.ngram_size, training_data_size);
}
cerr<<"Created eigen map"<<endl;
#else
if (use_mmap_file == false) {
training_data = Map<Matrix<int, Dynamic, Dynamic> >(
training_data_flat.data(), myParam.ngram_size, training_data_size);
}
#endif
由于MAP没有预定义,运行training_data = Map< Matrix<int dynamic=""> >(training_data_flat.data(), myParam.ngram_size, training_data_size);得到的结果是,生成一个int类型的二维矩陈,其中行数为myParam.ngram_size (即3), 列数为training_data_size (即ngram的样例数). 二维矩阵的值可能根据vector training_data_flat进行初始化.
接着,
if (use_mmap_file == false && randomize == true) {
cerr << "Randomly shuffling data..." << endl;
// Randomly shuffle training data to improve learning
for (data_size_t i = training_data_size - 1; i > 0; i--) {
data_size_t j = uniform_int_distribution<data_size_t>(0, i - 1)(rng);
training_data.col(i).swap(training_data.col(j));
}
}
对training_data中的一些进行替换, 即对数据进行重新洗牌.3) 读取校正数据
// Read validation data
vector<int> validation_data_flat;
int validation_data_size = 0;
if (myParam.validation_file != "") {
readDataFile(myParam.validation_file, myParam.ngram_size,
validation_data_flat);
validation_data_size = validation_data_flat.size() / myParam.ngram_size;
cerr << "Number of validation instances: " << validation_data_size << endl;
}
Map<Matrix<int, Dynamic, Dynamic> > validation_data(
validation_data_flat.data(), myParam.ngram_size, validation_data_size);
与训练数据处理的类似, 得到校正数据的二维矩阵validation_data4) 读取输入单词/和输出单词文件
vector<string> input_words;
if (myParam.input_words_file != "") {
readWordsFile(myParam.input_words_file, input_words);
if (myParam.input_vocab_size == 0)
myParam.input_vocab_size = input_words.size();
}
vector<string> output_words;
if (myParam.output_words_file != "") {
readWordsFile(myParam.output_words_file, output_words);
if (myParam.output_vocab_size == 0)
myParam.output_vocab_size = output_words.size();
}
对每个ngram, 前n-1项数字对应的单词可根据输入单词文件找到原型. 而第n项数字对应的单词可根据输出单词文件找到原型.5)
vector<data_size_t> unigram_counts(myParam.output_vocab_size);
for (data_size_t train_id = 0; train_id < training_data_size; train_id++) {
int output_word;
if (use_mmap_file == false) {
output_word = training_data(myParam.ngram_size - 1, train_id);
} else {
//cerr<<"mmap word is "<<training_data_flat_mmap->at((train_id+1)*myParam.ngram_size - 1)<<endl;
output_word = training_data_flat_mmap->at(
(train_id + 1) * myParam.ngram_size - 1);
}
//cerr<<"output word is "<<output_word<<endl;
unigram_counts[output_word] += 1;
}
multinomial<data_size_t> unigram(unigram_counts);
unigram_counts统计每个输出单词出现的次数, unigram_counts[i]表示编号为i的单词出现在ngram最后一项的次数.
unigram为一个多项式分布变量,以unigram_counts初始化每个输出单词的概率.
5) 模型训练
model nn;
// IF THE MODEL FILE HAS BEEN DEFINED, THEN
// LOAD THE NEURAL NETWORK MODEL
if (myParam.model_file != "") {
nn.read(myParam.model_file);
cerr << "reading the model" << endl;
} else {
nn.resize(myParam.ngram_size, myParam.input_vocab_size,
myParam.output_vocab_size, myParam.input_embedding_dimension,
myParam.num_hidden, myParam.output_embedding_dimension);
nn.initialize(rng, myParam.init_normal, myParam.init_range,
-log(myParam.output_vocab_size), myParam.parameter_update,
myParam.adagrad_epsilon);
nn.set_activation_function(
string_to_activation_function(myParam.activation_function));
}
loss_function_type loss_function = string_to_loss_function(
myParam.loss_function);
在model类(model.h)中, 定义了:
Matrix<double,Dynamic,Dynamic,Eigen::RowMajor> output_embedding_matrix,
input_embedding_matrix,
input_and_output_embedding_matrix;
Input_word_embeddings input_layer;
Output_word_embeddings output_layer;
其中input_embedding_matrix和output_embedding_matrix都是动态维数的double类型矩阵.
2015年6月4日星期四
nplm代码学习与使用 (1)
一. 下载/编译/示例运行
1) 从http://nlg.isi.edu/software/nplm/ 下载nplm-0.3.tar.gz
2) 修改src/Makefile (根据其他软件在本机安装的路径)
CXX=/usr/bin/g++
BOOST=/usr/local
EIGEN=/usr/local/include/eigen3
PYTHON_ROOT=/usr
BOOST_LIB_SUFFIX=
3) 切换至src目录下, 编译: make all
4) 切换至example目录下, 运行: make
根据屏幕上打印信息可以看到运行了以下命令:
a.
sed -n 10339,15586p pg8800.txt | ./preprocess.pl > inferno.txt
准备数据, 生成文本文件inferno.txt, 即该文件为训练语言模型的文件.
b.
./train_ngram.sh inferno.txt inferno.nnlm work
该命令进一步分别执行以下命令:
I:
/home/li***/toolkit/NEURAL_LANGUAGE_MODEL/example/../src/prepareNeuralLM --train_text inferno.txt --ngram_size 3 --vocab_size 5000 --validation_size 500 --write_words_file work/words --train_file work/train.ngrams --validation_file work/validation.ngrams
数据准备
以上读取文本文件inferno.txt, 生成词汇文件work/words, 并对单词数字化, 数字化后生成3-gram的训练文件work/train.ngrams和校正文件work/validation.ngrams.
II:
/home/li***/toolkit/NEURAL_LANGUAGE_MODEL/example/../src/trainNeuralNetwork --train_file work/train.ngrams --validation_file work/validation.ngrams --num_epochs 10 --words_file work/words --model_prefix work/inferno.nnlm --learning_rate 1 --minibatch_size 8
训练模型
III:
/home/li***/toolkit/NEURAL_LANGUAGE_MODEL/example/../src/testNeuralNetwork --test_file work/train.ngrams --model_file inferno.nnlm
测试
二. 加载到eclipse项目中
1) 新建eclipse项目nplm, 并将以上src文件夹中的代码(包括Makefile)复制到nplm文件夹中. 为了使用已有的makefile文件, 需要告诉eclipse不自动生成makefile文件.
Project Properties (right click on project and select properties) -> C/C++ Build -> in that window uncheck "Generate Makefiles Automatically."
再将src同一目录夹下的3rdparty文件夹复制到nplm中.
2) 修改Makefile文件 (在以上修改Makefile的基础之上):
TCLAP=./3rdparty/tclap/include
CFLAGS=-g
2) 为每个main创建一个target
这样可以在eclipse下调试各个main方法.
1) 从http://nlg.isi.edu/software/nplm/ 下载nplm-0.3.tar.gz
2) 修改src/Makefile (根据其他软件在本机安装的路径)
CXX=/usr/bin/g++
BOOST=/usr/local
EIGEN=/usr/local/include/eigen3
PYTHON_ROOT=/usr
BOOST_LIB_SUFFIX=
3) 切换至src目录下, 编译: make all
4) 切换至example目录下, 运行: make
根据屏幕上打印信息可以看到运行了以下命令:
a.
sed -n 10339,15586p pg8800.txt | ./preprocess.pl > inferno.txt
准备数据, 生成文本文件inferno.txt, 即该文件为训练语言模型的文件.
b.
./train_ngram.sh inferno.txt inferno.nnlm work
该命令进一步分别执行以下命令:
I:
/home/li***/toolkit/NEURAL_LANGUAGE_MODEL/example/../src/prepareNeuralLM --train_text inferno.txt --ngram_size 3 --vocab_size 5000 --validation_size 500 --write_words_file work/words --train_file work/train.ngrams --validation_file work/validation.ngrams
数据准备
以上读取文本文件inferno.txt, 生成词汇文件work/words, 并对单词数字化, 数字化后生成3-gram的训练文件work/train.ngrams和校正文件work/validation.ngrams.
II:
/home/li***/toolkit/NEURAL_LANGUAGE_MODEL/example/../src/trainNeuralNetwork --train_file work/train.ngrams --validation_file work/validation.ngrams --num_epochs 10 --words_file work/words --model_prefix work/inferno.nnlm --learning_rate 1 --minibatch_size 8
训练模型
III:
/home/li***/toolkit/NEURAL_LANGUAGE_MODEL/example/../src/testNeuralNetwork --test_file work/train.ngrams --model_file inferno.nnlm
测试
二. 加载到eclipse项目中
1) 新建eclipse项目nplm, 并将以上src文件夹中的代码(包括Makefile)复制到nplm文件夹中. 为了使用已有的makefile文件, 需要告诉eclipse不自动生成makefile文件.
Project Properties (right click on project and select properties) -> C/C++ Build -> in that window uncheck "Generate Makefiles Automatically."
再将src同一目录夹下的3rdparty文件夹复制到nplm中.
2) 修改Makefile文件 (在以上修改Makefile的基础之上):
TCLAP=./3rdparty/tclap/include
CFLAGS=-g
2) 为每个main创建一个target
这样可以在eclipse下调试各个main方法.
2014年11月3日星期一
关于安装moses提示boost::iostreams的错误信息
1) 如果提示找不到类库文件/usr/bin/ld: cannot find -lboost_iostreams
重新安装boost, 确保在/usr/local/lib/ 目录(或自定义的boost安装目录)下存在 libboost_iostreams.*等文件.
2) 如果提示类似下面的错误
重新安装boost, 确保在/usr/local/lib/ 目录(或自定义的boost安装目录)下存在 libboost_iostreams.*等文件.
2) 如果提示类似下面的错误
/usr/include/boost/iostreams/filter/zlib.hpp:345: undefined reference to `boost::iostreams::detail::zlib_base::before(char const*&, char const*, char*&, char*)' /usr/include/boost/iostreams/filter/zlib.hpp:346: undefined reference to `boost::iostreams::zlib::no_flush' /usr/include/boost/iostreams/filter/zlib.hpp:346: undefined reference to `boost::iostreams::detail::zlib_base::xdeflate(int)' /usr/include/boost/iostreams/filter/zlib.hpp:347: undefined reference to `boost::iostreams::detail::zlib_base::after(char const*&, char*&, bool)'
查看安装boost时zlib设置是否正确, 如果安装boost (如运行./b2 install)时, 出现下面的提示,
- zlib : no (cached)
说明找不到zlib. 解决的办法是从http://www.zlib.net/下载zlib (如zlib-1.2.8.tar.gz), 并且解压.
在命令行下设置zlib路径
export ZLIB_SOURCE=/........./zlib-1.2.8
重新运行安装boost命令
再重新运行安装moses命令
2014年5月23日星期五
ctb8.0 及LDC2012E109_BOLT_Phase_1_Chinese_Treebank_DF_Part_1 标注bug
1)
LDC2012E109_BOLT_Phase_1_Chinese_Treebank_DF_Part_1/data/bolt-cmn-NG-21-181152-105489.cmn.su.fid
( (IP (NP-SBJ (NN 面子) )
(VP (VP (VC 是)
(NP-PRD (CP (WHNP-1 (-NONE- *OP*))
(CP (IP (NP-SBJ (PN 自己) )
(VP (VV 挣)
(NP-OBJ (-NONE- *T*-1))) )
(DEC 的) ))) )
(PU ,)
(VP (ADVP (AD 不) )
(VP (VC 是)
(NP-PRD (CP (WHNP-2 (-NONE- *OP*))
(CP (IP (NP-SBJ-3 (-NONE- *T*-2))
(VP (PP-LGS (P 靠)
(NP (NP (PN 别人) )
(NP (NN 施舍) ) ) )
(VP (VV 给)
(NP-OBJ (-NONE- *)-3)) ) ) ||| --> (NP-OBJ (-NONE- *T*-3)) ) ) )
(DEC 的) ))) ) ) ) ) )
2) LDC2012E109_BOLT_Phase_1_Chinese_Treebank_DF_Part_1/data/bolt-cmn-NG-21-181152-105489.cmn.su.fid
( (IP (IP-ADV (NP-SBJ (-NONE- *pro*))
(VP (ADVP (AD 或) )
(ADVP (AD 正) )
(VP (VC 是)
(PP-PRD (P 由于)
(NP (PN 此) ) ) ) ) )
(PU ,)
(PP-LOC (P 在)
(LCP (NP (DP (DT 这)
(CLP (M 个) ) )
(NP (NN 讨论组) ) )
(LC 中) ))
(PU ,)
(NP-SBJ (DP (DT 其他) )
(NP (NN 与会者) ) )
(VP (ADVP (AD 也) )
(VP (VV 认为)
(IP-OBJ (PP-LOC (P 在)
(LCP (NP-TMP (NT 当前)
(NN 危机) )
(LC 中) ) )
(NP-SBJ (-NONE- *pro*))
(VP (VV 存在)
(NP-OBJ (CP (WHNP-1 (-NONE- *OP*))
(CP (IP (NP-SBJ-2 (-NONE- *T*-1))
(VP (VV 可以)
(VP (SB 被)
(VP (VV 利用)
(NP-OBJ (-NONE- *)-2)) ) ) ) ||| --> (NP-OBJ (-NONE- *T*-2)) ) ) ) )
(DEC 的) ))
(NP (NN 机会) ) ) ) ) ) )
(PU 。) ) )
3) ctb8.0/data/bracketed/chtb_3095.bn (same if it's ctb7.0)
( (IP (NP-TPC (CP ((WHNP-4 (-NONE- *OP*)) ||| --> ( (IP (NP-TPC (CP (WHNP-4 (-NONE- *OP*))
CP (IP (NP-SBJ (NN 地方) ||| --> (CP (IP (NP-SBJ (NN 地方)
(NN 当局))
(VP (ADVP (AD 正在))
(VP (VV 组织)
(NP-OBJ (-NONE- *T*-4)))))
(DEC 的)))
(ADJP (JJ 紧急))
(NP (NN 求援)))
(PU ,)
(ADVP (AD 但是))
(PP-MNR (P 据)
(NP (NN 报道)))
(PU ,)
(NP-SBJ (CP (WHNP-1 (-NONE- *OP*))
(CP (IP (NP-SBJ (-NONE- *T*-1))
(VP (QP-ADV (CD 1多))
(VP (VA 深))))
(DEC 的)))
(NP (NN 大雪)))
(VP (PP-BNF (P 给)
(NP (NN 求援)
(NN 工作)))
(VP (VV 造成)
(AS 了)
(NP-OBJ (CP (WHNP-2 (-NONE- *OP*))
(CP (IP (NP-SBJ (-NONE- *T*-2))
(VP (ADVP (AD 极))
(VP (VA 大))))
(DEC 的)))
(NP (NN 困难)))))
(PU 。)))
2014年4月11日星期五
(Linux Terminal) Comment overwirtes itself if it is too long
Run the command b4 typing the long one
shopt -s checkwinsize
订阅:
博文 (Atom)