自然语言处理作为人工智能的一个重要分支,在我们的生活中得到了广泛应用。其中RNN算法作为自然语言处理的经典算法之一,是文本生成的重要手段。而今天我们就将利用RNN算法建立一个写歌词的软件。其中的界面如下:
RNN指的是循环神经网络,RecurrentNeuralNetwork。不同于前馈神经网络的是,RNN可以利用它内部的记忆来处理任意时序的输入序列,这让它可以更容易处理如不分段的手写识别、语音识别等。
RNN模型有比较多的变种,这里介绍最主流的RNN模型结构如下:
这幅图描述了在序列索引号tt附近RNN的模型。其中:
基于以上认知,我们开始搭建我们的软件。
实验前的准备
首先我们使用的python版本是3.6.5所用到的库有TensorFlow,是用来训练和加载神经网络常见的框架,常常用于数值计算的开源软件库。节点表示数学操作,线则表示在节点间相互联系的多维数据数组,即张量(tensor);tkinter用来绘制GUI界面的库;
Pillow库在此项目中用来处理图片和字体等问题。因为我们的软件不是空白背景的。需要借助Image函数添加背景。
RNN算法搭建
1、数据集处理和准备:
我们训练的数据集使用各种歌手的歌词本作为训练集。其中数据集放在date.txt里,其中部分数据集如下:
2、模型的训练:
模型训练的代码直接运行train.py即可训练。其中流程如下:
其中代码如下:
deftrain():filename='date.txt'withopen(filename,'r',encoding='utf-8')asf:text=f.read()reader=TxtReader(text=text,maxVocab=3500)reader.save('voc.data')array=reader.text2array(text)generator=GetBatch(array,n_seqs=100,n_steps=100)model=CharRNN(numClasses=reader.vocabLen,mode='train',numSeqs=100,numSteps=100,lstmSize=128,numLayers=2,lr=0.001,Trainprob=0.5,useEmbedding=True,numEmbedding=128)model.train(generator,logStep=10,saveStep=1000,maxStep=100000)
3、RNN网络搭建:
RNN算法的搭建,我们定义整个神经网络类,然后分别定义初始化、输入、神经元定义等函数。损失函数和优化器使用均方差和AdamOptimizer优化器即可。
部分代码如下:
4、歌词的生成:
设置关键词变量,读取模型文件,输出结果即可。
代码如下:
defmain(_):reader=TxtReader(filename='voc.data')model=CharRNN(numClasses=reader.vocabLen,mode='test',lstmSize=128,numLayers=2,useEmbedding=True,numEmbedding=128)checkpoint=tf.train.latest_checkpoint('./models/')model.load(checkpoint)key="雪花"prime=reader.text2array(key)array=model.test(prime,size=reader.vocabLen,n_samples=300)print("《"+key+"》")print(reader.array2text(array))
界面的定义和调用
界面中我们的布局是文本框、编辑框和按钮控件。程序的调用使用批处理文件调用以达到显示运行过程的效果。因为如果没有运行过程,难免会导致用户不清楚程序流程而强制运行容易导致卡死的情况。
其中Bat里直接写入:
pythonsong.py
其中过程效果如下:
1、界面布局:
界面布局使用canvas画布以达到添加背景图片的效果。背景图片设置为1.jpg,按钮背景图片设置为3.jpg。图片也可以自己更换掉。然后文本框作为提示的效果,分别定义字体,大小等等即可
root=tk.Tk()root.title('AI写歌词')#背景canvas=tk.Canvas(root,width=800,height=500,bd=0,highlightthickness=0)imgpath='1.jpg'img=Image.open(imgpath)photo=ImageTk.PhotoImage(img)
imgpath2='3.jpg'img2=Image.open(imgpath2)photo2=ImageTk.PhotoImage(img2)canvas.create_image(700,400,image=photo)canvas.pack()label=tk.Label(text="请输入关键词:",font=("微软雅黑",20))entry=tk.Entry(root,insertbackground='blue',highlightthickness=2,font=("微软雅黑",15))entry.pack()entry1=tk.Text(height=15,width=115)entry1.pack()
2、功能调用:
我们使用按钮中的command参数调用已设置好的函数即可。其中函数部分我们通过生成文本和删除文本的方式读入数据和写入数据。为了防止数据重叠故在要时刻监测重复软件。定义的函数内容如下:
defsong():ss=entry.get()f=open("1.txt","w")f.write(ss)f.close()os.startfile("1.bat")whileTrue:ifos.path.exists("2.txt"):f=open("2.txt")ws=f.read()f.close()entry1.insert("0.0",ws)breaktry:os.remove("1.txt")os.remove("2.txt")except:pass
3、GUI代码:
整个GUI界面代码如下:
importtkinterastkfromPILimportImageTk,Imageimportostry:os.remove("1.txt")os.remove("2.txt")except:passimportosdefsong():ss=entry.get()f=open("1.txt","w")f.write(ss)f.close()os.startfile("1.bat")whileTrue:ifos.path.exists("2.txt"):f=open("2.txt")ws=f.read()f.close()entry1.insert("0.0",ws)breaktry:os.remove("1.txt")os.remove("2.txt")except:passroot=tk.Tk()root.title('AI写歌词')#背景canvas=tk.Canvas(root,width=800,height=500,bd=0,highlightthickness=0)imgpath='1.jpg'img=Image.open(imgpath)photo=ImageTk.PhotoImage(img)
imgpath2='3.jpg'img2=Image.open(imgpath2)photo2=ImageTk.PhotoImage(img2)canvas.create_image(700,400,image=photo)canvas.pack()label=tk.Label(text="请输入关键词:",font=("微软雅黑",20))entry=tk.Entry(root,insertbackground='blue',highlightthickness=2,font=("微软雅黑",15))entry.pack()entry1=tk.Text(height=15,width=115)entry1.pack()bnt=tk.Button(width=15,height=2,image=photo2,command=song)canvas.create_window(100,50,width=200,height=30,window=label)canvas.create_window(500,50,width=630,height=30,window=entry)canvas.create_window(400,100,width=220,height=50,window=bnt)canvas.create_window(400,335,width=600,height=400,window=entry1)root.mainloop()
到这里,我们整体的程序就搭建完成,下面为我们程序的运行过程和结果:
源码地址:
提取码:iz5m
作者简介:李秋键,CSDN博客专家,CSDN达人课作者。硕士在读于中国矿业大学,开发有taptap安卓武侠游戏一部,vip视频解析,文意转换工具,写作机器人等项目,发表论文若干,多次高数竞赛获奖等等。