前面所述的LSTM网络中用到TimeDistributed()这个网络层,实际上是将RNN展开后的每个网络的输出都算入到最终的输出结果里,比如说序列“我今天吃了一个大包子”,按照之前的网络,如果每批次有3个序列,每个序列有4个词(字),那么一个批次的数据就是“我今天吃”,对应的输出是“今天吃了”,每个输入词对应的输出是它的下一个词。
如果我们不关心序列中间的输出,只关心输入序列的最后一个预测词,比如输入是“我今天吃”,输出只有一个词“了”,那么需要改变LSTM网络结构,最后一层LSTM网络设置return_sequence=False,直接在后面加一个Dense(units=vocabulary_size, activation='softmax')这样即可。下面来说说怎么产生训练数据。
先将本文分割一下,分为train.txt, valid.txt, test.txt,然后可以自建一个predict.txt,在里面输入自己一段起始地文本,模型将根据这个进行预测。
# -*- coding: utf-8 -*-
"""
Created on Mon Aug 27 06:14:13 2018
@author: xiaozhen
split the text to train, valid, test; as well, the space can be deleted
"""
import re
#pattern = re.compile(r'[\n,。!?]')
pattern = re.compile(r'\s+')
with open('data