📫

基于word2vec的lstm模型训练

创建时间
Jul 4, 2022 06:15 AM
简介:
自然语言处理nlp基础模型训练过程
标签
Paper
状态
已完成

导入数据

导入两个不同的数据结构,一个是400000个单词的python词表 另一个是word2vec输出的400000*50的嵌入矩阵。通过word2vec模型将语料库输出为一个嵌入矩阵,可以使用gensim库或者直接使用现成的嵌入矩阵

将训练文本转化为词向量

训练集使用的是IMDB数据集,一半积极一半消极,首先对训练集进行预处理,再将每条文本转化为词序列,25000条评论最终转化为25000*250的索引矩阵,250是根据句子的正态分布获得。

辅助函数

在迭代的过程中分为测试阶段和训练阶段。

rnn模型

1、定义超参数和占位符
构建图模型,首先定义一些超参数,比如批处理大小、LSTM的单元个数、分类类别和训练次数;
与大多数tensorFlow图一样,我们需要指定两个占位符,一个是标签占位符,取决于这个数据是积极的还是消极的,另一个是输入占位符,是一个整数化的索引数组;
2、将嵌入矩阵和索引矩阵转化为一个三维向量
通过TensorFlow的嵌入函数,即tf.nn.embedding_lookup(),存在两个参数,一个是嵌入矩阵Embedding Matrix,另一个是索引矩阵,转化为一个三维向量,第一个维度是批处理大小,第二个维度是句子长度,第三个维度是词向量长度;
notion image
3、将lstm神经元和三维向量构建rnn模型
得到三维向量之后,需要将三维向量输入到LSTM网络中,首先使用tf.nn.rnn_cell.BasicLSTMCell函数,这个函数的参数是一个整数,表示需要几个LSTM单元,已经在超参数中定义,然后使用tf.contrib.rnn.DropoutWrapper函数,参数是dropout参数和lstmCell,通过此函数来避免一些过拟合,最后我们将lstmCell和三维向量输入到tf.nn.dynamic_rnn,这个函数的功能是展开整个网络,并且构建一个RNN模型;
4、将结果通过权重矩阵和偏置项来获得最终值
dynamic RNN函数的第一个输出可以被认为是最后的隐藏状态向量,这个向量将会被重新确定维度,然后乘以最后的权重矩阵和偏置项来获得最终的输出值;
notion image
5、计算正确率和损失率
定义正确的预测函数和正确率评估函数,正确的预测形式是查看最后输出的0-1向量是否和标记的0-1向量相同。
correctPred = tf.equal(tf.argmax(prediction,1),tf.argmax(labels,1))
accuracy = tf.reduce_mean(tf.cast(correctPred,tf.float32))
最后使用一个标准的交叉熵损失函数来作为损失值,对于最优解,我们选择Adam,并且采用默认的学习率;
loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction,labels=labels))
optimizer = tf.train.AdamOptimizer().minimize(loss)