为你写诗 [3]


基于 Tensorflow 实现自动作诗(古诗)机器人。本文是系列文章三,从数据流变换的角度来简单介绍 Demo 生成诗歌的过程。

相关文章:
为你写诗 [1]
为你写诗 [2]
相关 Github 源码

版权声明:本文为 frendy 原创文章,可以随意转载,但请务必在明确位置注明出处。


重载参数和模型


模型训练我们在文章《为你写诗 [1]》和《为你写诗 [2]》中已经完成,现在使用时只需要重新载入训练时持久化下来的参数和模型即可。详情可参考 Demo 代码,这里就不详细说明啦。


生成 Sample


下面是数据流变换过程,还是以大家都熟悉的《悯农》为例,这里笔者以字符 “锄” 开头。其实,下面一系列变换直接照搬了 char-rnn 里随机选择字符的方法,为什么这么处理?还望有大神不吝赐教,这里先谢过。

** vocab = {'^': 6, '土': 21, '汗': 4, ',': 3, '午': 7, '锄': 10, '谁': 19, '辛': 14, '粒': 0, '苦': 17, '知': 16, '当': 9, '下': 11, '日': 20, '皆': 15, '。': 2, '禾': 1, '盘': 5, '餐': 12, '$': 18, '中': 8, '滴': 13, '*': 22}

** chars = ^锄

** x = [[ 6 10]]
sess.run([self.probs,self.final_state],{self.input_data: x,self.initial_state: state})

** probs[-1] = weights = 
  [ 0.04201746  0.05162039  0.05662962  0.03021749  0.02953894  0.03858508
  0.03475175  0.04856787  0.05444941  0.0520597   0.02933978  0.03519193
  0.03243973  0.05847431  0.03798598  0.03890398  0.05775708  0.04891997
  0.05474302  0.0344351   0.04930111  0.04917176  0.03489855]
t = np.cumsum(weights)

** t = 
  [ 0.04201746  0.09363785  0.15026747  0.18048497  0.21002391  0.24860899
  0.28336075  0.33192861  0.38637802  0.43843773  0.46777752  0.50296944
  0.53540915  0.59388345  0.63186944  0.67077339  0.72853047  0.77745044
  0.83219343  0.86662853  0.91592962  0.96510136  0.99999988]
s = np.sum(weights)

** s = 0.9999998807907104
sample = int(np.searchsorted(t, np.random.rand(1)*s))

** sample = 7

** vocab[sample] = 午

好了,到这里我们的结果已经生成为 “锄午”。接下来以 “午” 为输入,同理预测下一个字符,遇到 “,” 或者 “。” 则结束本句生成即可。


文末诗一首,送给看到文章的你:

万树旦已见,事值逾苍林。
如何求圣恶,意意具华时。

image


欢迎来撩

frendy

It will shine for us...