当前位置:   article > 正文

深度学习实战:keras框架,循环神经网络做文本预测和文本生成_神经网络 文本生成

神经网络 文本生成

学习笔记。仅供参考!

1.介绍

基于keras框架的深度学习实战,利用三国演义文本集,LSTM神经网络模型,训练文本数据,预测文本,自动生成文本。
本文使用Sequential 顺序模型,它可以由多个网络层线性堆叠。也可以使用 Keras 函数式 API,可以构建任意的神经网络图。

Sequential 模型如下所示:

from keras.models import Sequential
model =Sequential()

使用 .add() 来堆叠模型:

from keras.layers import Dense
model.add(Dense(units=64, activation=‘relu’, input_dim=100))
model.add(Dense(units=10, activation=‘softmax’))

在完成了模型的构建后, 使用.compile() 来配置学习过程:

model.compile(loss=‘categorical_crossentropy’, optimizer=‘sgd’,metrics=[‘accuracy’])

如果需要,进一步地配置你的优化器。Keras 的核心原则是使事情变得相当简单,同时又允许用户在需要的时候能够进行完全的控制(终极的控制是源代码的易扩展性。

model.compile(loss=keras.losses.categorical_crossentropy,optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True))

现在,你可以批量地在训练数据上进行迭代了:

model.fit(x_train, y_train, epochs=5, batch_size=32)

或者,你可以手动地将批次的数据提供给模型

model.train_on_batch(x_batch, y_batch)

只需一行代码就能评估模型性能:

loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128)

对新的数据生成预测:

classes = model.predict(x_test, batch_size=128)

三国演义文本数据自取:
链接:https://pan.baidu.com/s/19-MktXVj2SaKGmAMIgVnFg
提取码:ri9w

2.数据处理

数据处理,思路:60000多个字符集,按照步长为3做平移,得到20000多个长度为20的样本,作为输入X,每20个字符来预测第21个字符Y,sentences = [ ] 是X的集合,next_chars = [ ]是Y的集合

加载数据集
    f = open('三国演义.txt', encoding='utf-8')
    text = f.read()
    print(text[:300])
    f.close()
    print('语料总长度:', len(text))
    sent_len = 20  # 样本长度,用前20个字来预测第21个字
    step = 3  # 在总文本上面平移取样本,步长为3
    sentences = []  # 样本集X,用来预测
    next_chars = []  # 样本集Y,真实值
    for i in range(0, len(text) - sent_len, step):
        # 获取样本,20个字符为一个样本,步长为3
        sentences.append(text[i:i + sent_len])
        # 预测文本的真实值
        next_chars.append(text[i + sent_len])
    print('训练样本数目:', len(sentences))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

创建字典,根据索引对应相应的字符,N表示字典个数

char_set = sorted(list(set(text)))  # 创建字典,文本的字符集,sorted()对文本进行排序
    N = len(char_set)  # 字典的长度,字的个数
    print('字典中字的个数:', N)
    # 根据值来获取索引,存入字典
    char_indices = dict((char, index) for index, char in enumerate(char_set))
    print(char_indices)
    '''
    语料总长度: 603705 >>>>文本总字符
    训练样本数目: 201229 >>>>>取步长为3,得到训练样本2w
    字典中字的个数: 3843 >>>>>根据N中字符的index来做one-hot编码,取index为1,其余取0
    '''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

对于输如样本X,是一个三维张量,(样本数量,样本长度,词向量N),利用N来表示词向量,将N中的值置为0,再根据char_indices ,将对应的字符找到相应的索引值,置为1,进而将词向量转成one-hot编码

print('Vectorization...')
    print(len(sentences), sent_len, len(char_set))
    #  len(sentences), sent_len, len(char_set):     201229 20 3843

    # 将样本数据np.zeros()张量数据置0,这里的N就是每一个字的词向量
    x = np.zeros((len(sentences), sent_len, N), dtype=bool)  # X用来做预测
    y = np.zeros((len(sentences), len(char_set)), dtype=bool)  # Y 真实集,sent_len=1
    # 对每一个字做one-hot编码,构成词向量
    for i, sentence in enumerate(sentences):
        for t, char in enumerate(sentence):
            x[i
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/725334
推荐阅读
相关标签
  

闽ICP备14008679号