基于LSTM网络的文本生成

更新时间:2023-07-10 00:49:56 阅读: 评论:0

基于LSTM⽹络的⽂本⽣成
import tensorflow as tf
import numpy as np
import os
#使⽤cpu进⾏运算,注释掉使⽤gpu运算
陪你到天涯os.environ["CUDA_VISIBLE_DEVICES"]="-1"
# 读取⽂件,所有⽂本读成⼀个字符串,总长度为600893
path = tf._file('',origin='/')
text =open(path).read().lower()
print('Cropus length',len(text))
⾸先读取数据,这个数据是⼀篇⽂章,包含的所有字符全部读取成⼀个字符串。
这⾥有个cpu个gpu切换的两⾏代码,注释掉这两⾏使使⽤gpu环境,这是⾸先安装gpu版的tensorflow。
# 采样过程,⼀个句⼦长度为60,隔3步取60长度为60的样本,总样本量为200278,
# ⼀个样本长度为60
maxlen =60
step =3
ntences =[]
next_chars =[]
for i in range(0,len(text)- maxlen, step):
ntences.append(text[i:i + maxlen])
next_chars.append(text[i + maxlen])
print('Number of quences:',len(ntences))
# 语料中唯⼀字符组成的列表,
# ⽣成⼀个字典,唯⼀的字符对应着其在chars中的索引
chars =sorted(list(t(text)))
print('Unique charactersss:',len(chars))
char_indices =dict((char, chars.index(char))for char in chars)
# 构建one-hot编码
x = np.zeros((len(ntences), maxlen,len(chars)), dtype=np.bool)白磷燃烧的化学方程式
y = np.zeros((len(ntences),len(chars)),dtype=np.bool)
for i, ntence in enumerate(ntences):
for t, char in enumerate(ntence):
x[i, t, char_indices[char]]=1
y[i, char_indices[next_chars[i]]]=1
四大美女图# 建⽴模型
model = dels.Sequential()
model.add(tf.keras.layers.LSTM(128,input_shape=(maxlen,len(chars))))
model.add(tf.keras.layers.Den(len(chars), activation='softmax'))顺赢通用版
optimizer = tf.keras.optimizers.RMSprop(lr=0.01)
市场营销专业介绍
# 给定模型预测,采样下⼀个字符的函数
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)
这⾥有⼀个知识点就是softmax温度,即参数temperature,⽤于控制采样过程中的随机性⼤⼩,这⾥的preds是⼀个预测的概率值组成的数组,之和等于1。softmax温度参数的作⽤就是上⾯代码所⽰的内容。
# ⽂本⽣成循环球兰花
import random
import sys
for epoch in range(1,60):
print('epoch', epoch)
model.fit(x, y, batch_size=128, epochs=1,verbo=0)
# 随机选择⼀个⽂本种⼦
start_index = random.randint(0,len(text)- maxlen -1)
generated_text = text[start_index:start_index + maxlen]
print('---Generating with ed: "'+ generated_text +'"')
for temperature in[0.2,0.5,1.0,1.2]:
print('-----temperature', temperature)
sys.stdout.write(generated_text)
# 从种⼦⽂本开始预测⽣成后400个字符
诸葛亮发明了什么
for i in range(400):
# 对⽬前⽣成的进⾏one-hot编码
sampled = np.zeros((1, maxlen,len(chars)))
for t, char in enumerate(generated_text):
sampled[0, t, char_indices[char]]=1
# 对下⼀个字符进⾏采样
preds = model.predict(sampled, verbo=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)
⽣成⽂本循环,⾸先是随机从原⽂本中选择⼀个长度为60的字符串,即sampled,在one-hot编码之后让算法跑⼀次,这个算法的label值其实就是输⼊数据的下⼀个字符,即第61个字符,将这个字符one-hot编码之后进⾏训练,预测结果就是输⼊字符串的第61个字符是什么,即sampled的第61个字符是什么,然后循环预测下⼀个字符的话就是把预测出来的字符添加到输⼊字符串sampled后⾯,要保持长度为60,既然在后⾯加了⼀个字符,那么就在前⾯舍弃⼀个字符,以此循环进⾏预测,就会⽣成⼀个⽐较长的字符串,这个模型⽐较简单,我看了下结果在不同的温度值下⽣成的⽂本也是有较⼤差别的(结果很长就不在这放了)

本文发布于:2023-07-10 00:49:56,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1075030.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:字符   预测   个字符   字符串
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图