最近在github 上发现了一个好玩的项目,一个基于LSTM + keras 实现的诗歌生成器,地址是:https://github.com/youyuge34/Poems_generator_Keras. 我去看了一下代码,实现的原理其实很common,就是普通的基于LSTM 的序列模型。模型使用了43030首诗进行训练,最后生成的诗歌还是有模有样的(当然仅限于有模有样,自然是不能深究的了)
 
  1. 模型的核心思路:
 input_tensor = Input(shape=(self.config.max_len, len(self.words)))
lstm = LSTM(512, return_sequences=True)(input_tensor)
dropout = Dropout(0.6)(lstm)
lstm = LSTM(256)(dropout)
dropout = Dropout(0.6)(lstm)
dense = Dense(len(self.words), activation='softmax')(dropout)
self.model = Model(inputs=input_tensor, outputs=dense)
optimizer = Adam(lr=self.config.learning_rate)
self.model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
keras 真的是极简的深度学习语言,上述短短的9行代码就已经包括了全部的模型结构,而且不需要注释基本都能看懂代码在做什么。
  • 第一行: 构造输入向量
  • 第二行,构造了一个LSTM layer, hidden units size = 512
  • 第三行,构造了一个dropout layer,dropout rate = 0.6
  • 第四行,构造了一个LSTM layer,hidden units size = 256
  • 第五行,构造了一个dropout layer,dropout rate = 0.6
  • 第六行,构造了一个全连接层+softmax 作为 output layer
  • 第七行,利用 inputs 和 outputs 构造Model
  • 第八行,使用 Adam 优化器
  • 第九行,compile model,指定了模型的损失函数类型为交叉熵损失,优化器以及评价指标
 
 首春:寒随穷律变,春逐鸟声开。初风飘带柳,晚雪间花梅。碧林青旧竹,绿沼翠新苔。芝田初雁去,绮树巧莺来。
 初晴落景:晚霞聊自怡,初晴弥可喜。日晃百花色,风动千林翠。池鱼跃不同,园鸟声还异。寄言博通者,知予物外志。
 初夏:一朝春夏改,隔夜鸟花迁。阴阳深浅叶,晓夕重轻烟。哢莺犹响殿,横丝正网天。珮高兰影接,绶细草纹连。碧鳞惊棹侧,玄燕舞檐前。何必汾阳处,始复有山泉。
度秋:夏律昨留灰,秋箭今移晷。峨嵋岫初出,洞庭波渐起。桂白发幽岩,菊黄开灞涘。运流方可叹,含毫属微理。
  • 冒号前的是诗的名字,冒号后的是诗的内容
 
3. 训练
  • 我使用的单卡 RTX2080ti(11G显存) 进行训练,按照作者的默认配置,一共 训练了 34000+ epoch,每个 epoch 耗时 1s 左右,总共训练了接近10个小时。最终得到的keras 可用的模型文件以及训练日志我放到百度云了,地址是:https://pan.baidu.com/s/1XV9InTe9vMmwKNs5lBS-tQ
 
4.训练完成之后,原始的代码一共提供了4个进行predict 的API:
  • predict_first:给定一个汉字,输出一首五言绝句
  • predict_random:随机从全部的训练诗作当中抽出一首诗的首句,然后生成一首诗
  • predict_gen:给定五个汉字作为首句,生成一首五言绝句
  • predict_hide:给定四个汉字,输出以这个四个汉字开头的藏头诗
  • 为了方便预测,我封装了一个简单的 命令行工具,提供了四种预测,代码可以参考我对原始repo 的 fork 版本(https://github.com/Lyrichu/Poems_generator_Keras/tree/huchengchun),使用方式如下:
 
 
 
 
 
5. 愉快地生成诗歌玩耍吧

最新文章

  1. JavaScript中对象的含义与this的指向
  2. angularJs案例汇总
  3. SSH无密码登陆Agent admitted failure to sign using the key
  4. POJ2185Milking Grid(最小覆盖子串 + 二维KMP)
  5. mimikatz不反弹读取密码
  6. Asp.net中WebForm 与 MVC的架构区别
  7. java编程规范
  8. node-webkit教程(16)调试typescript
  9. 全局变量&局部变量
  10. automake使用
  11. 数据中心基础设施自动化运维之puppet专项
  12. BZOJ 3707: 圈地 计算几何
  13. [置顶] Oracle学习路线与方法
  14. 哈尔滨理工大学第六届程序设计团队 E-Mod
  15. [国嵌攻略][142][LCD驱动程序架构]
  16. TP5.0 excel 导入导出
  17. 最大连接数:60 iops:150 什么概念?
  18. c/c++ 重载运算符 标准库function的用法
  19. LODOP 获取打印设计代码不带INIT初始化语句
  20. Windows下安装单机Kafka

热门文章

  1. Property or method "openPageOffice" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by
  2. Linux新手到大佬系列——1
  3. 用strtotime()和date()函数算出2019年9月的周日日期
  4. [HNOI2009] 有趣的数列——卡特兰数与杨表
  5. Educational Codeforces Round 74 (Rated for Div. 2) A. Prime Subtraction
  6. JavaScript中的变量提升和严格模式
  7. 牛客练习赛39 B.选点
  8. P3979 遥远的国度 树剖
  9. LoadLibraryA 和 GetProcAddress 调用动态库
  10. C语言学习笔记3-运算符和表达式