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)
使用LSTM生成文本代码
最新推荐文章于 2023-07-26 22:08:10 发布