LSTM生成文本

github地址
使用循环神经网络生成序列文本数据。循环神经网络可以用来生成音乐、图像作品、语音、对话系统对话等等。

如何生成序列数据?

深度学习中最常见的方法是训练一个网络模型(RNN或者CNN)通过之前的tokens预测下一个或者之后的几个token序列。通常在处理文本数据时,tokens通常是单词或字符,任何可以对给定前一个tokens时对下一个令牌的概率进行建模的网络模型称为语言模型。语言模型能捕捉语言的潜在空间特性:其统计结构特征

一旦你有了这样一个训练有素的语言模型,你就可以从中进行采样(生成新的序列):你给它一个初始的文本字符串(称为条件数据),让它生成下一个字符或下一个字(你甚至可以一次生成几个tokens),将生成的输出添加回输入数据,并多次重复该过程(见图8.1)。

此循环允许生成任意长度的序列,这些序列反映了训练模型的数据结构:看起来几乎与人类书写句子相似的序列。

取样策略

生成文本时,选择下一个字符的方式至关重要。一种朴素的方法是贪婪采样--总是选择最可能的下一个字符。但是这种方法导致重复的,可预测的字符串看起来不连贯。一种更有趣的方法会产生更令人惊讶的选择:它通过从下一个字符的概率分布中抽样,在抽样过程中引入随机性。这称为随机抽样。注意,贪心采样也可以作为概率分布的采样:一个特定字符的概率为1而其他概率为0。

从模型的softmax输出中概率地采样是巧妙的:它允许在某些时候对不太可能的字符进行采样,产生更有趣的句子,并且有时通过提出在训练数据中未发生的新的,逼真的单词来显示模型创造力。但是这个策略存在一个问题:它没有提供一种控制采样过程中随机性的方法。

随机性的重要性。考虑一个极端情况:纯随机抽样,从均匀概率分布中绘制下一个字符,并且每个角色都具有相同的可能性。该方案具有最大随机性;换句话说,该概率分布具有最大熵。当然,它不会产生任何有趣的东西。在另一个极端,贪婪的采样也不会产生任何有趣的东西,并且没有随机性:相应的概率分布具有最小的熵。从“真实”概率分布中抽样(由模型的softmax函数输出的分布)构成这两个极端之间的中间点。但是,可能希望探索许多其他更高或更低熵的中间点。较少的熵将使生成的序列具有更可预测的结构(因此它们可能看起来更逼真),而更多的熵将导致更令人惊讶和创造性的序列。
当从生成模型中抽样时,在生成过程中探索不同量的随机性总是好的。因为我们是生成数据有趣程度的终极判断,所以相互作用是高度主观的,并且不可能事先知道最佳熵点在哪里。
为了控制采样过程中的随机性,我们将引入一个名为softmax temperature的参数,该参数表示用于采样的概率分布的熵:它表征下一个字符的选择将会出乎意料或可预测的程度。给定温度值,通过以下列方式对其进行重新加权,从原始概率分布(模型的softmax输出)计算新的概率分布。

import numpy as npdef reweight_distribution(original_distribution, temperature=0.5):distribution = np.log(original_distribution) / temperature#原始分布为1D,和为1;distribution = np.exp(distribution)return distribution / np.sum(distribution)

较高的temperature导致较高熵的采样分布,这将产生更多令人惊讶和非结构化的生成数据,而较低的temperature将导致较少的随机性和更可预测的生成数据。

实现字符级LSTM文本生成

用Keras将这些想法付诸实践。第一件事是准备用来学习语言模型的大量文本数据。可以使用任何足够大的文本文件或一组文本文件---维基百科,指环王等等。在这个例子中,你将使用19世纪晚期德国哲学家尼采(Nietzsche)的一些著作(翻译成英文)。因此,将学习的语言模型将特别是尼采的写作风格和选择主题的模型,而不是更通用的英语模型。

准备数据
下载数据,转换成小写

import keras
import numpy as nppath = keras.utils.get_file('nietzsche.txt',origin='https://s3.amazonaws.com/text-datasets/nietzsche.txt')text = open(path).read().lower()
print('Corpus length:',len(text))

之后,将提取长度为maxlen的部分重叠序列,对它们进行one-hot编码,打包成3D numpy数组形式,形状(squences,maxlen,unique_characters).同时,将准备一个包含相应目标的数组y:每个提取序列之后的one-hot编码字符。

maxlen = 60#句子最大长度
step = 3#每3个字符对句子进行采样
sentences = []
next_chars = []#targetsfor i in range(0,len(text)-maxlen,step):sentences.append(text[i:i+maxlen])next_chars.append(text[i+maxlen])print('Number of sequences:', len(sentences))
chars = sorted(list(set(text)))#字典
print('Unique characters:', len(chars))char_indices = dict((char, chars.index(char)) for char in chars)#字符-id对应关系
print('Vectorization...')
x = np.zeros((len(sentences), maxlen, len(chars)), dtype=np.bool)
y = np.zeros((len(sentences), len(chars)), dtype=np.bool)for i, sentence in enumerate(sentences):#one-hotfor t, char in enumerate(sentence):x[i, t, char_indices[char]] = 1y[i, char_indices[next_chars[i]]] = 1

构建模型
LSTM+Dense;但是RNN并不是唯一生成序列文本的模型,1D卷积也可以达到相同的效果。

from keras import layersmodel = keras.models.Sequential()
model.add(layers.LSTM(128,input_shape=(maxlen,len(chars))))
model.add(layers.Dense(len(chars),activation='softmax'))optimizer = keras.optimizers.RMSprop(lr=0.01)
model.compile(loss='categorical_crossentropy',optimizer=optimizer)

语言模型训练、采样
给定训练有素的模型和种子文本片段,可以通过重复执行以下操作来生成新文本:

  1. 给定到目前为止生成的文本,从模型中绘制下一个字符的概率分布;
  2. 将分布重新调整到某个temperature;
  3. 根据重新加权的分布随机抽取下一个字符;
  4. 在可用文本的末尾添加新字符。

根据模型预测对下一个字符采样

def sample(preds, temperature=1.0):preds = np.asarray(preds).astype('float64')preds = np.log(preds) / temperatureexp_preds = np.exp(preds)preds = exp_preds / np.sum(exp_preds)#重新加权调整probas = np.random.multinomial(1, preds, 1)return np.argmax(probas)#返回概率最大的字符下标

最后,以下循环重复训练并生成文本。可以在每个epochs之后使用一系列不同的temperature开始生成文本。这使可以了解生成的文本在模型开始收敛时如何演变,以及temperature对采样策略的影响。

import random
import sysfor epoch in range(1, 60):print('epoch', epoch)model.fit(x, y, batch_size=128, epochs=1)start_index = random.randint(0, len(text) - maxlen - 1)generated_text = text[start_index:start_index+maxlen]#种子文本print('--- Generating with seed: "' + generated_text + '"')for temperature in [0.2, 0.5, 1.0, 1.2]:#不同temperature生成文本对比print('------ temperature:', temperature)sys.stdout.write(generated_text)for i in range(400):#从种子文本开始,生成400个字符sampled = np.zeros((1, maxlen, len(chars)))#种子文本one-hot编码for t, char in enumerate(generated_text):sampled[0, t, char_indices[char]] = 1.preds = model.predict(sampled, verbose=0)[0]#下一个字符预测next_index = sample(preds, temperature)next_char = chars[next_index]generated_text += next_char#添加到之前文本中generated_text = generated_text[1:]#新的文本数据sys.stdout.write(next_char)#预测生成的字符

种子文本‘new faculty, and the jubilation reached its climax when kant.’;
epochs=20,temperature=0.2,生成文本序列:

new faculty, and the jubilation reached its climax when kant and such a man
in the same time the spirit of the surely and the such the such
as a man is the sunligh and subject the present to the superiority of the
special pain the most man and strange the subjection of the
special conscience the special and nature and such men the subjection of the
special men, the most surely the subjection of the special
intellect of the subjection of the same things and

temperature=0.5:

new faculty, and the jubilation reached its climax when kant in the eterned
and such man as it's also become himself the condition of the
experience of off the basis the superiory and the special morty of the
strength, in the langus, as which the same time life and "even who
discless the mankind, with a subject and fact all you have to be the stand
and lave no comes a troveration of the man and surely the
conscience the superiority, and when one must be w

epochs=60,模型开始收敛,生成文本看起来更有意义,temperature=0.2:

cheerfulness, friendliness and kindness of a heart are the sense of the
spirit is a man with the sense of the sense of the world of the
self-end and self-concerning the subjection of the strengthorixes--the
subjection of the subjection of the subjection of the
self-concerning the feelings in the superiority in the subjection of the
subjection of the spirit isn't to be a man of the sense of the
subjection and said to the strength of the sense of the

temperature=0.5:

cheerfulness, friendliness and kindness of a heart are the part of the soul
who have been the art of the philosophers, and which the one
won't say, which is it the higher the and with religion of the frences.
the life of the spirit among the most continuess of the
strengther of the sense the conscience of men of precisely before enough
presumption, and can mankind, and something the conceptions, the
subjection of the sense and suffering and the

正如所看到的,低temperature值导致极其重复且可预测的文本,但局部结构非常逼真:特别是,所有单词都是真正的英语单词。随着temperature的升高,生成的文本变得更有趣,令人惊讶,甚至创造性;它有时会发明一些听起来有些合理的新词(比如说eterned)。在高temperature下,局部结构开始分解,大多数单词看起来像半随机字符串。毫无疑问,0.5是这个特定设置中文本生成最有趣的temperature值。始终尝试多种采样策略!学习结构和随机性之间的巧妙平衡是让生成有趣的原因。

请注意,通过训练更大的模型,更长的数据,可以获得生成的样本,这些样本看起来比这个更连贯和更真实。当然,除了随机机会之外,不要期望生成任何有意义的文本:您所做的只是从统计模型中抽取数据,其中字符来自哪些字符。
语言是一种通信渠道,通信的内容与通信编码的消息的统计结构之间存在区别。

小结

  • 可以通过训练模型来生成离散序列数据:预先给定前一个tokens生成下一个tokens;
  • 文本生成模型成为语言模型,基于单词或字符;
  • 对下一个tokens进行采样需要在遵守模型判断可能性和引入随机性之间取得平衡;
  • 解决这个问题的一种方法是softmax temperature的概念。始终尝试不同的temperature,找到合适的temperature。

keras采用LSTM生成尼采风格文章相关推荐

  1. python神经网络风格_[Deep-Learning-with-Python]使用LSTM生成尼采风格文章

    github地址repos LSTM生成文本 使用循环神经网络生成序列文本数据.循环神经网络可以用来生成音乐.图像作品.语音.对话系统对话等等. 如何生成序列数据? 深度学习中最常见的方法是训练一个网 ...

  2. 手把手写深度学习(8)——用LSTM生成手写英文文章

    前言:本系列前文介绍了用GANs生成手写数字,生成手写数字的任务是一件非常简单.入门的事情,因为MNIST数据集提供的,像素点非常低,最后生成的效果也非常模糊.要知道,高分辨率的生成一直是深层生成问题 ...

  3. 一个关于LSTM生成歌词的练习

    说明 这是一个个人练习笔记,使用Python语言,Keras搭建神经网络 数据使用的是王力宏的歌词,包含91首歌,共2列属性:歌曲名(Title),歌词(Lyrics)(来源:网易云音乐) 导入各种包 ...

  4. 从零开始学keras之使用 LSTM 生成文本

    下面用 Keras 来实现这些想法.首先需要可用于学习语言模型的大量文本数据.我们可以使用任意足够大的一个或多个文本文件--维基百科.<指环王>等.本例将使用尼采的一些作品,他是 19 世 ...

  5. [大哲学家——尼采] 论老妪和少妇 ——这个文章不知道该如何评价了。

    论老妪和少妇 "你为何如此战战兢兢在黄昏中踽踽独行,查拉图斯特拉?你小心翼翼 在大衣里藏掖着什么? 是你赠给自己的宝物吗?是你生的小孩吗?抑或,你现在走上行窃之路 ,你,恶人之友,是吗?&q ...

  6. 使用LSTM生成文本

    使用LSTM生成文本 概述 如何生成序列数据 生成文本的采样策略 文本序列生成程序流程 准备并解析初始文本 将字符序列向量化 构建神经网络模型 训练语言模型并采样 用模型生成文本 概述 我们的感知模式 ...

  7. 基于LSTM三分类的文本情感分析,采用LSTM模型,训练一个能够识别文本postive, neutral, negative三种

    基于LSTM三分类的文本情感分析,采用LSTM模型,训练一个能够识别文本postive, neutral, negative三种 ,含数据集可直接运行 完整代码下载地址:基于LSTM三分类的文本情感分 ...

  8. Tensorflow③ Keras的LSTM和TF的LSTM实现的源码剖析

    最近在做可以转成pb模型的RNN/LSTM层的实现细节分析.经过一些分析,发现了在Keras里面常见的keras.layers.LSTM和Tensorflow的tf.contrib.rnn.LSTMC ...

  9. RNN入门(三)利用LSTM生成旅游点评

    介绍   前几天,某个公众号发文质疑马蜂窝网站,认为它搬运其它网站的旅游点评,对此,马蜂窝网站迅速地做出了回应.相信大多数关注时事的群众已经了解了整个事情的经过,在这里,我们且不论这件事的是是非非,也 ...

最新文章

  1. robotframework使用RequestsLibrary进行http接口测试
  2. mysql 压力测试知乎_MySQL 对于千万级的大表要怎么优化? - MySQL
  3. mysql黄色版_Linux机上运行多个版本的MySQL
  4. mysql技术内幕《读书笔记》
  5. python是一种什么类型的高级语言_python介绍 编程语言分类及对比 python解释器安装(多版本共存) 变量 数据类型(三种)...
  6. 西北工业大学noj数据结构实验003稀疏矩阵转置
  7. 微擎支持html微信支付,微信小程序云开发:现已原生支持微信支付
  8. How to Write a simple UEFI EDKII Application:如何编写一个UEFI简单的应用程序[5]
  9. java.util.concurrent.ThreadFactory 实例讲解
  10. 【python gensim使用】word2vec词向量处理英文语料
  11. 如何看懂源代码--(分析源代码方法)
  12. 如何彻底关闭win11自动更新
  13. 1.mysql 的安装
  14. JavaScript-修炼之路第五层
  15. 关于File()中的pathname的路径
  16. word中将一种颜色的突出显示批量替换为另一种
  17. Hwang Keum-Ok asked:
  18. 如何绘制公司组织结构图
  19. gm修改爆率需要重启服务器吗,传奇GM教程 传奇私服如何调整爆率
  20. PMP-项目经理的角色

热门文章

  1. Spring Data JPA OneToMany注解参数orphanRemoval,一对多删除详解
  2. 爱奇艺新财报:转机频频
  3. 简单实用的添加字幕及去水印的方法及操作步骤
  4. Biperpedia: An Ontology for Search Applications/ 应用于搜索应用的本体!
  5. jquery拖动DIV
  6. 搭建用户登录与注册界面项目
  7. 揭开芯面纱 主流平板电脑方案深度剖析之ARMv5,v6,v7架构阵营
  8. 新品疑似违反开源协议,TikTok被海外网友举报
  9. 制作可以滚动的卡片式界面
  10. 百度被判歌词搜索侵权