使用LSTM生成文本代码

import tensorflow as tf
import keras
import numpy as np
import random
import sys
from keras import layers
#下载并解析初试文本文件
path=keras.utils.get_file(
    'nietzsche.txt',origin='https://s3.amazonaws.com/text-dataset/nietzsche.txt'
)
text=open(path).read().lower()
print('Corpus length:',len(text))
#将字符序列向量化
moxlen=60#提取60个字符组成的序列
step=3#每3个字符采取一个新序列
sentences=[]#保存所提取的序列
next_chars=[]#保存目标(即下一个字符)
for 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)#一个字典,将唯一字符映射为它在序列表chars中的索引
print('Vectorization...')
#将字符one-hot编码为二进制数组
x=np.zeros((len(sentences),maxlen,len(chars)),dtype=np.bool)
y=np.zeros((len(sentences),len(chars)),dtype=np.bool)
for i,sentences in enumerate(sentences):
    for t,char in enumerate(sentences):
        x[i,t,char_indices[char]]=1
    y[i,char_indices[next_chars[i]]]=1

model=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)
#给定模型预测,采取下一个字符的函数
def sample(preds,temperature=1.0):
    preds=np.asarray(preds).astype('float64')
    preds=np.log(preds)/temperature
    exp_preds=np.exp(preds)
    preds=exp_preds/np.sum(exp_preds)
    probas=np.random.multinomial(1,preds,1)
    return  np.argmax(probas)
#文本生成循环
for epoch in range(1,60):#将模型训练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]:#尝试一系列不同的采样温度
        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_chars=chars[next_index]
            generated_text+=next_char
            generated_text=generated_text[1:]
            sys.stdout.write(next_char)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值