时间:2025-07-17 作者:游乐小编
这是一个基于GRU的哲理与爱情文本生成器。用wordstest.txt作数据集,通过字映射构建字表,模型含嵌入层、双向GRU层和全连接层。训练时以固定长度文本为输入预测下一字,迭代优化参数。使用时输入开头文字,模型生成指定长度文本,生字会提示未学会。
因为数据集偏向哲理和爱情
我对你的爱
我对你的爱恋中,我愿为此生,爱爱可多少善果才能与他漫步人生路?朋友如海水般,承载你无数的泪花;欢乐时,白浪掀天,波涛声依旧没有能够脱离其中。执子之手,往事既往不咎,执子之手,往事既往不咎,执子之手,我们注定?一昧的消沉,失落,伪装出虚伪的自己,只愿愿以一袭泯念过无数的看着,安慰着,轻抚疼痛的心。
再不会为了一句话,而和人争得面红耳赤;再不会为了一句话,而和此刻绽放。 站在都市的一隅,感受那些渐行渐远,耳际忽而响起<怒放的生命>的旋律,激起我心中一股莫名的渴望。轻轻拉开窗帘,一场春雨,淋湿了虔诚向往的花朵,许许多多的回忆片段如同雨浇开的花香,坐在窗帘的边缘点燃生命的歌喉。
古藤老树昏鸦,断肠人在天涯。韶光荏苒,记不起年少的轻狂,不再想当年的慷慨激昂。一路奔波流浪,一路磕磕绊绊。笑荏苒燃的前世与无奈,尘世中没有哪一空中的征程时,点出事情中痴迷,无奈生命里伏伏起起,你有经的青春很
就是从上到下运行全部代码,注释掉倒数第二个代码块,这个为训练的,然后最后一个代码块就是测试代码块,就是玩的。
让你输入开头几个字,然后输出自定义字数的句段。
本项目主要就是用了GRU,然后数据集构造非常简单,就是放在wordstest.txt里面,也可以自己改数据集训练哦。
为了简单,本项目的batch_size为1,没有使用dataset这些。
import numpy as np import paddleimport paddle.nn.functional as Fimport timeimport randomfrom collections import CounterRANDOM_SEED = 123paddle.seed(RANDOM_SEED)def elapsed(sec): if sec < 60: return str(sec) +"sec" elif sec< 60*60: return str(sec/60)+"min" else : return str(sec/(60*60)) +"hr"training_file = "wordstest.txt" #定义样本文件def readalltxt(txt_files): labels = [] for txt_file in txt_files: target = get_ch_lable(txt_file) labels.append(target) return training_filedef get_ch_lable(txt_file): labels = "" with open(txt_file,"rb") as f: # print(f) #<_io.BufferedReader name='wordstest.txt'> for label in f: labels = labels + label.decode("utf-8") return labelsdef get_ch_lable_v(txt_file,word_num_map,txt_label = None): words_size = len(word_num_map) to_num = lambda word:word_num_map.get(word,words_size)#如果word没有在训练集出现过,就输出words_size if txt_file != None: txt_label = get_ch_lable(txt_file) labels_vector = list(map(to_num,txt_label)) return labels_vectortraining_data = get_ch_lable(training_file)print("loaded training data...")print("样本长度:",len(training_data))counter = Counter(training_data)# print(counter)words = sorted(counter)# print(words)words_size = len(words)word_num_map = dict(zip(words,range(words_size))) # 字映射到对应的独热编码print("字表大小",words_size)wordlabel = get_ch_lable_v(training_file,word_num_map)# print(wordlabel)登录后复制
loaded training data...样本长度: 4240字表大小 1016登录后复制
class GRURNN(paddle.nn.Layer): def __init__(self,word_size,embed_dim,hidden_dim,output_size,num_layers): super(GRURNN,self).__init__() self.num_layers = num_layers self.hidden_dim = hidden_dim self.embed = paddle.nn.Embedding(word_size,embed_dim) self.gru = paddle.nn.GRU(input_size=embed_dim,hidden_size=hidden_dim,num_layers=num_layers,direction = "bidirectional") self.fc = paddle.nn.Linear(hidden_dim*2,output_size)#输出概率 def forward(self,features,hidden): embedded = self.embed(features.reshape([1,-1])) output,hidden = self.gru(embedded.reshape([1,1,-1]),hidden) # output = self.attention(output) output = self.fc(output.reshape([1,-1])) return output,hidden def init_zero_state(self): init_hidden = paddle.zeros([self.num_layers*2,1,self.hidden_dim]) return init_hidden登录后复制
EMBEDDING_DIM = 10HIDDEN_DIM = 20NUM_LAYERS = 1model = GRURNN(words_size, EMBEDDING_DIM, HIDDEN_DIM, words_size, NUM_LAYERS)optimizer = paddle.optimizer.Adam(learning_rate=0.005,parameters=model.parameters())#定义测试函数def evaluate(model, prime_str, predict_len, temperature=0.8): hidden = model.init_zero_state() predicted = '' #处理输入语义 for p in range(len(prime_str) - 1): _, hidden = model(prime_str[p], hidden) predicted +=words[prime_str[p]] inp = prime_str[-1] predicted +=words[inp] for p in range(predict_len): output, hidden = model(inp, hidden) #从多项式分布中采样 output_dist = output.reshape([-1]).divide(paddle.to_tensor(temperature)).exp() inp = paddle.multinomial(output_dist, 1)[0] predicted += words[inp] return predicted登录后复制
W0309 22:03:40.237079 1212 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1W0309 22:03:40.242807 1212 device_context.cc:465] device: 0, cuDNN Version: 7.6.登录后复制
# #定义参数训练模型# training_iters = 20000# display_step = 1000# n_input = 20# step = 0# offset = random.randint(0,n_input+1)# end_offset = n_input + 1# while step < training_iters:# start_time = time.time()# # 随机取一个位置偏移# if offset > (len(training_data)-end_offset):# offset = random.randint(0, n_input+1) # inwords =wordlabel[offset:offset+n_input]# inwords = np.reshape(np.array(inwords), [n_input, -1, 1])# out_onehot = wordlabel[offset+1:offset+n_input+1]# hidden = model.init_zero_state()# # print(hidden)# optimizer.clear_grad() # loss = 0.# inputs, targets = paddle.to_tensor(inwords), paddle.to_tensor(out_onehot)# for c in range(n_input):# outputs, hidden = model(inputs[c], hidden)# loss += F.cross_entropy(outputs, targets[c].reshape([1]))# loss /= n_input#求每个字的平均loss# loss.backward()# optimizer.step()# #输出日志# with paddle.set_grad_enabled(False):# if (step+1) % display_step == 0:# print(f'Time elapsed: {(time.time() - start_time)/60:.4f} min')# print(f'step {step+1} | Loss {loss.item():.2f}\n\n')# with paddle.no_grad():# print(evaluate(model, inputs, 32), '\n')# print(50*'=')# paddle.save(model.state_dict(), 'model_state'+str(2)+'.pdparams')# step += 1# offset += (n_input+1)#中间隔了一个,作为预测# print("Finished!")登录后复制
import paddlen_input =20 layer_state_dictm = paddle.load("model_state2.pdparams")model.set_state_dict(layer_state_dictm)while True: prompt = "请输入几个字,最好是%s个: " % n_input#因为训练我设置的句子长度为20,但是实际输入短一点又无所谓 sentence = input(prompt) if sentence == "break": break inputword = sentence.strip() try: inputword = get_ch_lable_v(None,word_num_map,inputword) keys = np.reshape(np.array(inputword), [ len(inputword),-1, 1]) zi_num = 400 model.eval() with paddle.no_grad(): sentence =evaluate(model, paddle.to_tensor(keys), zi_num)# zi_num就代表后面继续模型输出字数 总共为n_input + zi_num print(sentence) # break except: print("该字我还没学会")登录后复制
请输入几个字,最好是20个: 风的悲伤登录后复制
风的悲伤着?茫然的心境,遥远的梦幻,飘荡,游离恍若几个世纪,那么漫长。为了那份渴望已久梦中痴缠的美丽,落日的晚霞像是给你披上漂亮的嫁衣,习习微风把你的面纱吹起,凝眸深处你的微笑惹人痴迷,无奈生命里伏伏起起,你的美永远刻在了无法倒转的悱侧惆怅,又有情深意意的悠悠旋律,不时的在你心中回荡。徘徊。萦绕间的人陶醉的温柔。往事都成过往云烟,无须无奈,尘世,无须追究,执子之手,我们注定?也许,是你的美丽婉却经的人争先恐后地射出地平线,沉寂的夜色默默退出舞台中间,润泽,用勉励去雕琢,用沟通去维系。 当我们踏上人生的征程时,可拨不可多问,无须追究,执子之手,我们注定?那些盛开在流淌。而我一场前世的你的娇嘀。是我熏醉。绕完圈,又回到原点。再回去,那片记忆中的怅惘是否已布满历史风尘的青苔?美丽的花。岁月荏苒,什么都可以改变,唯一手抚平处你的笑容岸,我爱泡一杯清茶,一片片盈绿,舞动翩翩,茗香阵阵,享受登录后复制
请输入几个字,最好是20个: 风的吹登录后复制
风的吹起,凝眸深处你的微笑惹人痴迷,无奈生命里伏伏起起,你的美永远刻在了最初的单纯,当岁月荒芜了似乎成熟的心田,文字是否仍可以承受很回;石桥上飘荡的魂灵,都舍得了前尘旧梦,断前因后果,忘尽一世浮沉得失,一生爱恨情仇。而我,千年华满天下就人生的方向,从痴痴地心。 有时偏执于一己的看法,旁观者清,当局者迷,朋友善意的提点,点出事情的利弊,道出性格的缺陷,为的是希望大家一起进步。虽然出于一片好心,人普遍面皮薄,请配合先赞后弹等技巧,请配合先赞后弹等技巧,请辅以诚恳温和的态度,否则,忠言逆耳,成了反效果,破坏双方的关系。 每一天的早晨我们还是需要坚强,即使远离你无数日子,我依偎在三生石畔夜。 再不会为了一句话,而和人争得面红耳赤;每心上的青面拼凑起。夕阳下你的美丽,落日的晚霞像是给你披上漂亮的嫁衣,习习微风把你的面纱吹起,凝眸深处你的微笑惹人痴迷,无奈生命里伏伏起起,你的美登录后复制
2021-11-05 11:52
手游攻略2021-11-19 18:38
手游攻略2021-10-31 23:18
手游攻略2022-06-03 14:46
游戏资讯2025-06-28 12:37
单机攻略