[返回和气生财首页]·[所有跟帖]·[ 回复本帖 ] ·[热门原创] ·[繁體閱讀]·[坛主管理]

转载 【深度学习】写诗机器人tensorflow实现

送交者: 桂花酒[♂★★★和气生财★★★♂] 于 2020-05-30 5:20 已读 19 次  

桂花酒的个人频道

+关注

回答: 机器人写诗出诗集首开专栏 人工智能挑战人类情感 由 桂花酒 于 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这是开头和结尾,这里用方括号表示。

1

poems = []

2

file = open(filename, "r")

3

for line in file: #every line is a poem

4

#print(line)

5

title, poem = line.strip().split(":") #get title and poem

6

poem = poem.replace(' ','')

7

if '_' in poem or '《' in poem or '[' in poem or '(' in poem or '(' in poem:

8

continue

9

if len(poem) < 10 or len(poem) > 128: #filter poem

10

continue

11

poem = '[' + poem + ']' #add start and end signs

12

poems.append(poem)

然后统计每个字出现的次数,并删除出现次数较少的生僻字

1

#counting words

2

allWords = {}

3

for poem in poems:

4

for word in poem:

5

if word not in allWords:

6

allWords[word] = 1

7

else:

8

allWords[word] += 1

9

# erase words which are not common

10

erase = []

11

for key in allWords:

12

if allWords[key] < 2:

13

erase.append(key)

14

for key in erase:

15

del allWords[key]

根据字出现的次数排序,建立字到ID的映射。为什么需要排序呢?排序后的ID从一定程度上表示了字的出现频率,两者之间有一定关系,比不排序直接映射更容易使模型学出规律。

添加空格字符,因为诗的长度不一致,需要用空格填补,所以留出空格的ID。最后将诗转成字向量的形式。

1

wordPairs = sorted(allWords.items(), key = lambda x: -x[1])

2

words, a= zip(*wordPairs)

3

words += (" ", )

4

wordToID = dict(zip(words, range(len(words)))) #word to ID

5

wordTOIDFun = lambda A: wordToID.get(A, len(words))

6

poemsVector = [([wordTOIDFun(word) for word in poem]) for poem in poems] # poem to vector

接下来构建训练batch,每一个batch中所有的诗都要补空格直到长度达到最长诗的长度。因为补的都是空格,所以模型可以学出这样一个规律:空格后面都是接着空格。X和Y分别表示输入和输出,输出为输入的错位,即模型看到字得到的输出应该为下一个字。

这里注意一定要用np.copy,坑死我了!

1

#padding length to batchMaxLength

2

batchNum = (len(poemsVector) - 1) // batchSize

3

X = []

4

Y = []

5

#create batch

6

for 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模板抄一份,改改参数就好了。

1

with tf.variable_scope("embedding"): #embedding

2

embedding = tf.get_variable("embedding", [wordNum, hidden_units], dtype = tf.float32)

3

inputbatch = tf.nn.embedding_lookup(embedding, gtX)

4

5

basicCell = tf.contrib.rnn.BasicLSTMCell(hidden_units, state_is_tuple = True)

6

stackCell = tf.contrib.rnn.MultiRNNCell([basicCell] * layers)

7

initState = stackCell.zero_state(np.shape(gtX)[0], tf.float32)

8

outputs, finalState = tf.nn.dynamic_rnn(stackCell, inputbatch, initial_state = initState)

9

outputs = tf.reshape(outputs, [-1, hidden_units])

10

11

with 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) + b

15

16

probs = tf.nn.softmax(logits)

模型训练

先定义输入输出,构建模型,然后设置损失函数、学习率等参数。

1

gtX = tf.placeholder(tf.int32, shape=[batchSize, None]) # input

2

gtY = tf.placeholder(tf.int32, shape=[batchSize, None]) # output

3

logits, probs, a, b, c = buildModel(wordNum, gtX)

4

targets = tf.reshape(gtY, [-1])

5

#loss

6

loss = tf.contrib.legacy_seq2seq.sequence_loss_by_example([logits], [targets],

7

[tf.ones_like(targets, dtype=tf.float32)], wordNum)

8

cost = tf.reduce_mean(loss)

9

tvars = tf.trainable_variables()

10

grads, a = tf.clip_by_global_norm(tf.gradients(cost, tvars), 5)

11

learningRate = learningRateBase

12

optimizer = tf.train.AdamOptimizer(learningRate)

13

trainOP = optimizer.apply_gradients(zip(grads, tvars))

14

globalStep = 0

然后开始训练,训练时先寻找能否找到检查点,找到则还原,否则重新训练。然后按照batch一步步读入数据训练,学习率逐渐递减,每隔几个step就保存一下模型。

1

with 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 checkPoint

7

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 epoch

15

learningRate = learningRateBase * (0.95 ** epoch)

16

epochSteps = len(X) # equal to batch

17

for step, (x, y) in enumerate(zip(X, Y)):

18

#print(x)

19

#print(y)

20

globalStep = epoch * epochSteps + step

21

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)

自动写诗

在自动写诗之前,我们需要定义一个输出概率对应到单词的功能函数,为了避免每次生成的诗都一样,需要引入一定的随机性。不选择输出概率最高的字,而是将概率映射到一个区间上,在区间上随机采样,输出概率大的字对应的区间大,被采样的概率也大,但胖虎也有小概率会选择其他字。因为每一个字都有这样的随机性,所以每次作出的诗都完全不一样。

1

def probsToWord(weights, words):

2

"""probs to word"""

3

t = np.cumsum(weights) #prefix sum

4

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 sampled

7

return words[index]

然后开始写诗,首先仍然是构建模型,定义相关参数,加载checkpoint。

1

gtX = tf.placeholder(tf.int32, shape=[1, None]) # input

2

logits, probs, stackCell, initState, finalState = buildModel(wordNum, gtX)

3

with 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 checkPoint

8

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方法转成字。

1

poems = []

2

for i in range(generateNum):

3

state = sess.run(stackCell.zero_state(1, tf.float32))

4

x = np.array([[wordToID['[']]]) # init start sign

5

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 += word

10

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往前滚动一下,直接跳过这个字的生成。

1

flag = 1

2

endSign = {-1: ",", 1: "。"}

3

poem = ''

4

state = sess.run(stackCell.zero_state(1, tf.float32))

5

x = np.array([[wordToID['[']]])

6

probs1, state = sess.run([probs, finalState], feed_dict={gtX: x, initState: state})

7

for c in characters:

8

word = c

9

flag = -flag

10

while word != ']' and word != ',' and word != '。' and word != ' ':

11

poem += word

12

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 updated

18

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

26

print(characters)

27

print(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)
1

qq_34418352

qq_44683403

u012614906

qq_32615143

拂晓序幕:
求助,运行evaluate出现no checkpoint found!该怎么解决,我没改过config里的type1年前
查看回复(2)
1

qq_32615143

qq_32615143

Aria_Miazzy

码哥星河子_YumWisdom:膜拜!!!16天前

HelloAlbus

HelloAlbus:
请问这个是怎么运行的?几个py项目分开?1月前

weixin_45756586

weixin_45756586:
请问您在GitHub上训练宋词模型的代码是哪一个5月前

qq_32615143

拂晓序幕:
这个诗词编码格式是01编码,还是word2vec,虽然感觉没有人搭理我。。。1年前
查看回复(1)

weixin_37790871

qq_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_37910190

qq_32615143

Turbo_Come

qq_32615143

sinat_36130499

sinat_36130499:
老哥,很期待你的看图写诗版胖虎,啥时候出啊,坐等膜拜2年前
查看回复(1)

u012614906

qq_38080117

qq_38080117:
不好意思,我又来了。又出现了这个问题no checkpoint found!网上没找到解决办法,你知道啥原因吗2年前
查看回复(6)

qq_32615143

u012614906

qq_38080117

u012614906

qq_38080117

u012614906

weixin_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_39531773

u012614906

登录 查看 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-10

Google面试经历(一) 【深度学习】写诗机器人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
喜欢桂花酒朋友的这个贴子的话, 请点这里投票,“赞”助支持!

内容来自网友分享,若违规或者侵犯您的权益,请联系我们

所有跟帖:   ( 主贴楼主有权删除不文明回复,拉黑不受欢迎的用户 )


用户名: 密码: [--注册ID--]

标 题:

粗体 斜体 下划线 居中 插入图片插入图片 插入Flash插入Flash动画


     图片上传  Youtube代码器  预览辅助

打开微信,扫一扫[Scan QR Code]
进入内容页点击屏幕右上分享按钮

楼主前期社区热帖:

>>>>查看更多楼主社区动态...



[ 留园条例 ] [ 广告服务 ] [ 联系我们 ] [ 个人帐户 ] [ 创建您的定制新论坛频道 ] [ Contact us ]