转载 【深度学习】写诗机器人tensorflow实现
回答: 机器人写诗出诗集首开专栏 人工智能挑战人类情感 由 桂花酒 于 2020-05-30 3:44
【深度学习】写诗机器人tensorflow实现
置顶 triplebee 2017-06-29 14:51:02 21056 收藏 31 展开
代码地址:https://github.com/hjptriplebee/Chinese_poem_generator, 欢迎fork, star机器人命名MC胖虎,目前只是最简单粗暴的方法,使用tensorflow完成,有些像人工智障,符合胖虎的人物设定,看一些效果:LSTM的原理网上资料很多,不了解的可以看这里:http://www.jianshu.com/p/9dc9f41f0b29本文以讲解写诗机器人实现为主,不会讲太多理论和tensorflow使用方法,好下面开始。训练数据预处理采用3w首唐诗作为训练数据,在github上dataset文件夹下可以看到,唐诗格式为”题目:诗句“,如下所示:我们首先通过”:“将题目和内容分离,然后做数据清洗过滤一些不好的训练样本,包含特殊符号、字数太少或太多的都要去除,最后在诗的前后分别加上开始和结束符号,用来告诉LSTM这是开头和结尾,这里用方括号表示。1poems = []2file = open(filename, "r")3for line in file: #every line is a poem4 #print(line)5 title, poem = line.strip().split(":") #get title and poem6 poem = poem.replace(' ','')7 if '_' in poem or '《' in poem or '[' in poem or '(' in poem or '(' in poem:8 continue9 if len(poem) < 10 or len(poem) > 128: #filter poem10 continue11 poem = '[' + poem + ']' #add start and end signs12 poems.append(poem)然后统计每个字出现的次数,并删除出现次数较少的生僻字 1#counting words2allWords = {}3for poem in poems:4 for word in poem:5 if word not in allWords:6 allWords[word] = 17 else:8 allWords[word] += 19# erase words which are not common10erase = []11for key in allWords:12 if allWords[key] < 2:13 erase.append(key)14for key in erase:15 del allWords[key]根据字出现的次数排序,建立字到ID的映射。为什么需要排序呢?排序后的ID从一定程度上表示了字的出现频率,两者之间有一定关系,比不排序直接映射更容易使模型学出规律。 添加空格字符,因为诗的长度不一致,需要用空格填补,所以留出空格的ID。最后将诗转成字向量的形式。1wordPairs = sorted(allWords.items(), key = lambda x: -x[1])2words, a= zip(*wordPairs)3words += (" ", )4wordToID = dict(zip(words, range(len(words)))) #word to ID5wordTOIDFun = lambda A: wordToID.get(A, len(words))6poemsVector = [([wordTOIDFun(word) for word in poem]) for poem in poems] # poem to vector接下来构建训练batch,每一个batch中所有的诗都要补空格直到长度达到最长诗的长度。因为补的都是空格,所以模型可以学出这样一个规律:空格后面都是接着空格。X和Y分别表示输入和输出,输出为输入的错位,即模型看到字得到的输出应该为下一个字。 这里注意一定要用np.copy,坑死我了!1#padding length to batchMaxLength2batchNum = (len(poemsVector) - 1) // batchSize3X = []4Y = []5#create batch6for i in range(batchNum):7 batch = poemsVector[i * batchSize: (i + 1) * batchSize]8 maxLength = max([len(vector) for vector in batch])9 temp = np.full((batchSize, maxLength), wordTOIDFun(" "), np.int32)10 for j in range(batchSize):11 temp[j, :len(batch[j])] = batch[j]12 X.append(temp)13 temp2 = np.copy(temp) #copy!!!!!!14 temp2[:, :-1] = temp[:, 1:]15 Y.append(temp2)搭建模型搭建一个LSTM模型,后接softmax,输出为每一个字出现的概率。这里对着LSTM模板抄一份,改改参数就好了。1with tf.variable_scope("embedding"): #embedding2 embedding = tf.get_variable("embedding", [wordNum, hidden_units], dtype = tf.float32)3 inputbatch = tf.nn.embedding_lookup(embedding, gtX)4 5basicCell = tf.contrib.rnn.BasicLSTMCell(hidden_units, state_is_tuple = True)6stackCell = tf.contrib.rnn.MultiRNNCell([basicCell] * layers)7initState = stackCell.zero_state(np.shape(gtX)[0], tf.float32)8outputs, finalState = tf.nn.dynamic_rnn(stackCell, inputbatch, initial_state = initState)9outputs = tf.reshape(outputs, [-1, hidden_units])10 11with tf.variable_scope("softmax"):12 w = tf.get_variable("w", [hidden_units, wordNum])13 b = tf.get_variable("b", [wordNum])14 logits = tf.matmul(outputs, w) + b15 16probs = tf.nn.softmax(logits)模型训练先定义输入输出,构建模型,然后设置损失函数、学习率等参数。1gtX = tf.placeholder(tf.int32, shape=[batchSize, None]) # input2gtY = tf.placeholder(tf.int32, shape=[batchSize, None]) # output3logits, probs, a, b, c = buildModel(wordNum, gtX)4targets = tf.reshape(gtY, [-1])5#loss6loss = tf.contrib.legacy_seq2seq.sequence_loss_by_example([logits], [targets],7 [tf.ones_like(targets, dtype=tf.float32)], wordNum)8cost = tf.reduce_mean(loss)9tvars = tf.trainable_variables()10grads, a = tf.clip_by_global_norm(tf.gradients(cost, tvars), 5)11learningRate = learningRateBase12optimizer = tf.train.AdamOptimizer(learningRate)13trainOP = optimizer.apply_gradients(zip(grads, tvars))14globalStep = 0然后开始训练,训练时先寻找能否找到检查点,找到则还原,否则重新训练。然后按照batch一步步读入数据训练,学习率逐渐递减,每隔几个step就保存一下模型。 1with tf.Session() as sess:2 sess.run(tf.global_variables_initializer())3 saver = tf.train.Saver()4 if reload:5 checkPoint = tf.train.get_checkpoint_state(checkpointsPath)6 # if have checkPoint, restore checkPoint7 if checkPoint and checkPoint.model_checkpoint_path:8 saver.restore(sess, checkPoint.model_checkpoint_path)9 print("restored %s" % checkPoint.model_checkpoint_path)10 else:11 print("no checkpoint found!")12 13 for epoch in range(epochNum):14 if globalStep % learningRateDecreaseStep == 0: #learning rate decrease by epoch15 learningRate = learningRateBase * (0.95 ** epoch)16 epochSteps = len(X) # equal to batch17 for step, (x, y) in enumerate(zip(X, Y)):18 #print(x)19 #print(y)20 globalStep = epoch * epochSteps + step21 a, loss = sess.run([trainOP, cost], feed_dict = {gtX:x, gtY:y})22 print("epoch: %d steps:%d/%d loss:%3f" % (epoch,step,epochSteps,loss))23 if globalStep%1000==0:24 print("save model")25 saver.save(sess,checkpointsPath + "/poem",global_step=epoch)自动写诗在自动写诗之前,我们需要定义一个输出概率对应到单词的功能函数,为了避免每次生成的诗都一样,需要引入一定的随机性。不选择输出概率最高的字,而是将概率映射到一个区间上,在区间上随机采样,输出概率大的字对应的区间大,被采样的概率也大,但胖虎也有小概率会选择其他字。因为每一个字都有这样的随机性,所以每次作出的诗都完全不一样。1def probsToWord(weights, words):2 """probs to word"""3 t = np.cumsum(weights) #prefix sum4 s = np.sum(weights)5 coff = np.random.rand(1)6 index = int(np.searchsorted(t, coff * s)) # large margin has high possibility to be sampled7 return words[index]然后开始写诗,首先仍然是构建模型,定义相关参数,加载checkpoint。 1gtX = tf.placeholder(tf.int32, shape=[1, None]) # input2logits, probs, stackCell, initState, finalState = buildModel(wordNum, gtX)3with tf.Session() as sess:4 sess.run(tf.global_variables_initializer())5 saver = tf.train.Saver()6 checkPoint = tf.train.get_checkpoint_state(checkpointsPath)7 # if have checkPoint, restore checkPoint8 if checkPoint and checkPoint.model_checkpoint_path:9 saver.restore(sess, checkPoint.model_checkpoint_path)10 print("restored %s" % checkPoint.model_checkpoint_path)11 else:12 print("no checkpoint found!")13 exit(0)生成generateNum这么多首诗,每首诗以左中括号开始,以右中括号或空格结束,每次生成的prob用probsToWord方法转成字。 1poems = []2for i in range(generateNum):3 state = sess.run(stackCell.zero_state(1, tf.float32))4 x = np.array([[wordToID['[']]]) # init start sign5 probs1, state = sess.run([probs, finalState], feed_dict={gtX: x, initState: state})6 word = probsToWord(probs1, words)7 poem = ''8 while word != ']' and word != ' ':9 poem += word10 if word == '。':11 poem += '\n'12 x = np.array([[wordToID[word]]])13 #print(word)14 probs2, state = sess.run([probs, finalState], feed_dict={gtX: x, initState: state})15 word = probsToWord(probs2, words)16 print(poem)17 poems.append(poem)还可以写藏头诗,前面的搭建模型,加载checkpoint等内容一样,作诗部分,每遇到标点符号,人为控制下一个输入的字为指定的字就可以了。需要注意,在标点符号后,因为没有选择模型输出的字,所以需要将state往前滚动一下,直接跳过这个字的生成。 1flag = 12endSign = {-1: ",", 1: "。"}3poem = ''4state = sess.run(stackCell.zero_state(1, tf.float32))5x = np.array([[wordToID['[']]])6probs1, state = sess.run([probs, finalState], feed_dict={gtX: x, initState: state})7for c in characters:8 word = c9 flag = -flag10 while word != ']' and word != ',' and word != '。' and word != ' ':11 poem += word12 x = np.array([[wordToID[word]]])13 probs2, state = sess.run([probs, finalState], feed_dict={gtX: x, initState: state})14 word = probsToWord(probs2, words)15 16 poem += endSign[flag]17 # keep the context, state must be updated18 if endSign[flag] == '。':19 probs2, state = sess.run([probs, finalState],20 feed_dict={gtX: np.array([[wordToID["。"]]]), initState: state})21 poem += '\n'22 else:23 probs2, state = sess.run([probs, finalState],24 feed_dict={gtX: np.array([[wordToID[","]]]), initState: state})25 26print(characters)27print(poem)大约在GPU上训练20epoch效果就不错了! 代码地址:https://github.com/hjptriplebee/Chinese_poem_generator,欢迎fork, star估计后续还会出看图写诗机器人-MC胖虎2.0说了这么多胖虎该生气了!展开阅读全文
点赞 15
评论 53
分享 收藏 31
手机看 打赏 文章举报
优质评论可以帮助作者获得更高权重
qq_44683403 《钟摆》:
我一直不明白def probsToWord(weights, words)这个函数的作用,np.cumsum的作用不是求和吗,你把所有的汉字的预测概率相加,最后一个是1,这到底有什么意义?我自己做的是直接取概率最大的结果的下标对应的汉字8月前
查看回复(3)
1qq_34418352qq_44683403u012614906qq_32615143 拂晓序幕:
求助,运行evaluate出现no checkpoint found!该怎么解决,我没改过config里的type1年前
查看回复(2)
1qq_32615143qq_32615143Aria_Miazzy 码哥星河子_YumWisdom:膜拜!!!16天前HelloAlbus HelloAlbus:
请问这个是怎么运行的?几个py项目分开?1月前weixin_45756586 weixin_45756586:
请问您在GitHub上训练宋词模型的代码是哪一个5月前qq_32615143 拂晓序幕:
这个诗词编码格式是01编码,还是word2vec,虽然感觉没有人搭理我。。。1年前
查看回复(1)weixin_37790871qq_40165314 qq_40165314:
运行main.py出现如下错误,大佬帮忙看看。 Traceback (most recent call last):File "main.py", line 22, in trainData = data.POEMS(trainPoems)File "C:\Users\Administrator\Downloads\Chinese_poem_generator-master\data.py", line 17, in __init__for line in file: #every line is a poem UnicodeDecodeError: 'gbk' codec can't decode byte 0xaa in position 2: illegal multibyte sequence1年前
查看回复(4)qq_37910190qq_32615143Turbo_Comeqq_32615143sinat_36130499 sinat_36130499:
老哥,很期待你的看图写诗版胖虎,啥时候出啊,坐等膜拜2年前
查看回复(1)u012614906qq_38080117 qq_38080117:
不好意思,我又来了。又出现了这个问题no checkpoint found!网上没找到解决办法,你知道啥原因吗2年前
查看回复(6)qq_32615143u012614906qq_38080117u012614906qq_38080117u012614906weixin_39531773 weixin_39531773:
然后,evaluate函数中 --------------------------------------------------------------------------- UnicodeDecodeError Traceback (most recent call last) in ()7879 if __name__ == "__main__": ---> 80 trainData = data.POEMS(trainPoems, isEvaluate=True)81 MCPangHu = EVALUATE_MODEL(trainData)82 MCPangHu.evaluate() ~\data.py in __init__(self, filename, isEvaluate)15 poems = []16 file = open(filename, "r") ---> 17 for line in file: #every line is a poem18 title, author, poem = line.strip().split("::") #get title and poem19 poem = poem.replace(' ','') UnicodeDecodeError: 'gbk' codec can't decode byte 0xaa in position 2: illegal multibyte sequence 也在疯狂报错,我改了open(trainPoems,encoding='utf-8',errors='ignore')还是不行。2年前
查看回复(2)weixin_39531773u012614906登录 查看 53 条热评
机器学习算法全栈工程师
7872 如何利用深度学习写诗歌(使用Python进行文本生成)
翻译:李雪冬 编辑:李雪冬 前 言从短篇小说到写5万字的小说,机器不断涌现出前所未有的词汇。在web上有大量的例子可供开发人员使用机器学习来编写文本,呈现的效果有荒谬的也有令人叹为观止的。 由于自然语言处理(NLP)领域的重大进步,机器能够自己理解上下文和编造故事。文本生成的例子包括,机器编写了流行小说的整个章节,比如《权力的游戏》和《哈利波特》,取得了不同程度的成功。在...
weixin_33725722的博客
234 干货 | 简简单单,用 LSTM 创造一个写诗机器人
作者 | Carly Stambaugh来源 | AI 科技评论人们已经给神经网络找到了越来越多的事情做,比如画画和写诗,微软的小冰都已经出版了一本诗集了。而其实训练一个能写诗的神经网络并不难,Automattic 公司的数据科学家 Carly Stambaugh 就写了一篇文章介绍如何简单快捷地建立一个会写诗的人工智能。「代码即诗篇」,这是 WordPress 社区的哲学。作为一个 coder ......
【深度学习】写诗机器人tensorflow实现_人工智能_无名..._CSDN博客5-3本文以讲解写诗机器人实现为主,不会讲太多理论和tensorflow使用方法,好下面开始。...基于RNN深度学习自动写诗的程序 07-03 人工智能写词机自动写诗 11-24 ...【深度学习】使用tensorflow实现VGG19网络_人工智能_无..._CSDN博客4-7——1引言———人工智能与艺术的交叉碰撞,不仅在相关的技术领域和艺术领域隐去...【深度学习】写诗机器人tensorflow实现 阅读数 19413 Google面试经历(一) 阅读... hubs个人博客
3904 在线AI智能写诗工具
调用了百度智能API,完成了这个智能写诗工具,希望大家喜欢。来源:https://www.toolfk.com/tool-online-poem
seanlee`s blog
4133 如何用深度学习来写歌词(神经网络实现)
循环神经网络RNN写歌词,PyTorch实现
...原理及tensorflow实现_人工智能_无名山丘,崛起成峰-CSDN博客5-10Google面试经历(一) 【深度学习】写诗机器人tensorflow实现 归档2018...(CNN)进行可视化的方法,当然它的用途不仅限于此,我们可以通过它让机器“做梦”...【深度学习】使用tensorflow实现AlexNet_人工智能_无名..._CSDN博客5-8【深度学习】写诗机器人tensorflow实现 20368 【深度学习】使用tensorflow实现Alex...AlexNet是2012年ImageNet比赛的冠军,虽然过去了很长时间,但是作为深度学习中的经... u014232627的博客
1万+ Tensorflow:基于LSTM生成藏头诗
使用TensorFlow,基于LSTM实现了自动生成藏头诗,古诗词。
【深度学习】谷歌deepdream原理及tensorflow实现_tenso..._CSDN博客1-12博文 来自: 无名山丘,崛起成峰 DeepDream 阅读数 ...近期风靡互联网的Deep Dream人工智能图像识别软件 阅读...【深度学习】写诗机器人tensorflow实现 阅读数 1万+...【深度学习】使用tensorflow实现AlexNet_无名山丘,崛起..._CSDN博客1-11【深度学习】写诗机器人tensorflow实现 阅读数 1万+ 代码地址:https://github...博文 来自: 无名山丘,崛起成峰 Tensorflow实现Alexnet对Imagenet的训练与评测 ... 无名山丘,崛起成峰
2万+ 【深度学习】使用tensorflow实现AlexNet
转载注明出处:http://blog.csdn.net/accepthjp/article/details/69999309AlexNet是2012年ImageNet比赛的冠军,虽然过去了很长时间,但是作为深度学习中的经典模型,AlexNet不但有助于我们理解其中所使用的很多技巧,而且非常有助于提升我们使用深度学习工具箱的熟练度。尤其是我刚入门深度学习,迫切需要一个能让自己熟悉tensorfl...
wyx100的专栏
6673 人工智能写唐诗完整项目文档(含代码)tensorflow+keras实现
转自:用Keras实现RNN+LSTM的模型自动编写古诗链接:https://www.ioiogoo.cn/2018/02/01/用keras实现rnnlstm的模型自动编写古诗/ 完整项目下载简介目前RNN循环神经网络可以说是最强大的神经网络模型之一了,可以处理大量的序列数据,目前已经广泛用于语音识别、文本分类、自然语言处理中了。现在有很多deeplearning的框架能很......
【深度学习】使用tensorflow实现VGG19网络 - 无名山丘,崛起成峰...11-22【深度学习】使用tensorflow实现VGG19网络 - 无名山丘,..._CSDN博客 10-11 ...【深度学习】写诗机器人tensorflow实现 阅读量:11929 解决win7系统不支持16位...【深度学习】使用tensorflow实现VGG19网络 - 无名山丘,崛起成峰12-20接上一篇AlexNet,本文讲述使用tensorflow实现VGG19网络。 VGG网络与AlexNet类似,...【深度学习】写诗机器人tensor... qq_44683403:[reply]u012614906[/reply] 这个...Quanfita的博客
3150 TensorFlow实现写诗机器人
TensorFlow实现写诗机器人概述 在这篇博客中,我们要使用RNN生成藏头诗,你给它输入一些古诗词,它会学着生成和前面相关联的字词。同样的如果你把训练数据换成一堆姓名,它也会学着生成姓名;给它训练一堆音乐,它会学着生成音乐,甚至可以给它训练源代码。 我们使用文本文件做为输入、训练RNN模型,然后使用它生成和训练数据类似的文本。 项目地址:GitHub使用的数据集:全唐诗......
henu_lisq的专栏
9289 在线写诗机器人
时下诗人之风盛行,赵诗人红了(突然想起来我大学的诗人同学) 。赵红了,一个机器人写诗网站也红了。于是去看看。http://www.dopoem.com/ 提供了两个写诗的模子,一个简易版、一个专业版,都是提供一个寺的架子,通过选择风格和头衔选择模子,并输入相关字段内容,保存为一首诗,我使用了一下,如果用心还是可以写出能让人懂其意思的段子的。以下是我测试的一首,苦命的祥子。呵呵...
木偶不哭不笑的博客
611 使用百度 AI 进行智能写诗 & 智能春联
注:本博客为博主在 百度 AI 社区 上分享的一篇文章,由于本博主也是作为一个学习者,所以如果文章中存在错误或者不适合的地方还请见谅。先来一波广告:如果你也喜欢开发,欢迎加入百度 AI 开发平台的核心团队,分享自己的 idea,当然也是有福利的,具体信息访问以下链接:【招募令】核心团队在找最优秀的你! 。如果不介意的话可以说是我推荐的哟,本博主百度AI社区ID:busyboxs百度 ......
无名山丘,崛起成峰
1万+ 【深度学习】谷歌deepdream原理及tensorflow实现
什么是DeepDream?DeepDream是谷歌发布的对卷积神经网络(CNN)进行可视化的方法,当然它的用途不仅限于此,我们可以通过它让机器“做梦”,以下是一些效果:可以看到计算机将自然图像的一些特征放大,生成了它想想中的一些物体。利用这个特点还可以生成一些从未有过的物体:DeepDream的原理卷积神经网络由于其从理论上难以解释,一直被很多学者诟病。在2013年...
garmoo的博客
1634 深度学习--写诗
@[TOC]深度学习深度学习–写诗使用深度学习写诗可以使用RNN/LSTM等具有记忆能力的神经网络结构实现。通过读取提供的诗样本来实现诗结构的记忆,然后通过类似默写(由上一个字符推测下一个字符)的方式来训练写诗能力。测试记忆训练情况通过dl4j的一个例子来测试下英文字符串的记忆训练情况,完整代码地址:https://github.com/deeplearning4j/dl4j-exampl......
cym的博客
1002 机器学习/深度学习个人进阶日志-基于Tensorflow的“作诗机器人”完整版
今天完成Tensorflow的第二个项目学习与实战——“作诗机器人”,也就是能够自动生成古诗,并且可以生成藏头诗,感觉比较有意思。其基本原理就是我上一篇博客中的“基于RNN的语言模型”,这个项目相当于是对这个模型的实战。参考博客:http://blog.topspeedsnail.com/archives/10542首先介绍实验平台和数据。实验平台:tensorflow 0.12python 3.......
Alive_lei的博客
151 机器人写唐诗,模型训练
coding=utf-8“”"author:leifunction: 机器人写唐诗“”"import tensorflow as tfimport numpy as npimport collectionsimport re提取数据def extract_data(file_path):poems = []with open(file_path, “r”, encoding...
X-CUBE-MCSDK-FUL_5.4.3.rar
01-07 深度学习 机器写诗词 唐诗生成
01-28 基于RNN深度学习自动写诗的程序
07-03 人工智能写词机自动写诗
11-24 无名山丘,崛起成峰
3万+ 【深度学习】使用tensorflow实现VGG19网络
接上一篇AlexNet,本文讲述使用tensorflow实现VGG19网络。VGG网络与AlexNet类似,也是一种CNN,VGG在2014年的ILSVRClocalizationandclassification两个问题上分别取得了第一名和第二名。VGG网络非常深,通常有16-19层,卷积核大小为3x3,16和19层的区别主要在于后面三个卷积部分卷积层的数量。第二个用tensorflow独立完成的小玩意儿......同样先放上我的代码,由AlexNet的代码改过来的:https://g...
机器人写诗测试数据集 poemsTest.txt
07-10
内容来自网友分享,若违规或者侵犯您的权益,请联系我们
所有跟帖: ( 主贴楼主有权删除不文明回复,拉黑不受欢迎的用户 )
楼主前期社区热帖:
>>>>查看更多楼主社区动态...