【AI作诗】主流平台介绍+自主搭建

诗歌总是属于文人的浪漫,但随着技术的发展,理科生文艺起来,也就没文科生什么事了(开玩笑的)。通过本篇文章,笔者将给大家介绍主流的AI诗歌创作平台及如何自己搭建,以供大家学习参考。

技术的进步是为了更好的服务原有的创作,而非取代,毕竟AI诗歌是没有灵魂的。

一、主流AI作诗平台介绍1、诗三百·人工智能诗歌写作平台

平台地址https://www.aichpoem.net/#/shisanbai/poem,支持绝句、律诗、词、对联等多种文学形式,类型比较齐全。

2、九歌·人工智能诗歌写作系统

平台地址http://jiuge.thunlp.org/,与诗三百比较类似,由清华大学自然语言处理与社会人文计算实验室研发。

3、华为乐府·人工智能作诗小程序

华为乐府AI是首个基于GPT打造的作诗系统,而且与谷歌提出的BERT息息相关。华为乐府本省作诗质量较高,但需付费。

4、微软小冰·AI现代诗歌创作系统

平台地址https://poem.xiaoice.com/,主打现代诗歌创作,值得注意的是其声明:小冰宣布放弃她创作的诗歌版权所以你可以任意发表最终的作品甚至不必提及她参与了你的创作,即创作作品完全归你所有。该平台可以通过图片和提示词训练创作诗歌,把相机中留下的美妙瞬间变成诗也是极不错的呢。

二、自主搭建

这里使用的项目地址为
https://github.com/lucasjinreal/tensorflow_poems,基于tensorflow开发的AI作诗项目。现在笔者就来介绍怎样自主搭建属于自己的AI作诗程序。

1、安装配置Anaconda

进入官网下载安装包https://www.anaconda.com/并安装,然后将Anaconda配置到环境变量中。

克隆项目后,在项目根目录新建文件environment.yml和空文件requirements.txt,并在environment.yml中填入如下内容:

name: poemai
channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- defaults
dependencies:
- pip==21.2.4
- python==3.10.6

打开命令行,依次通过如下命令创建Python运行虚拟环境。

conda env create
E:\workspace\02_Python\002_AI作诗>conda info --envs
# conda environments:
#
base * D:\anaconda3
novelai D:\anaconda3\envs\novelai
poemai D:\anaconda3\envs\poemai
E:\workspace\02_Python\002_AI作诗>conda activate poemai

但需要注意的是,此时安装的tensorflow已经是第2版了,而项目是基于tensorflow1.10 api开发的,需修改:

import tensorflow as tf =>
import tensorflow.compat.v1 as tf

否则会出现如下错误:

(poemai) E:\workspace\02_Python\002_AI作诗>python train.py
Traceback (most recent call last):
File "E:\workspace\02_Python\002_AI作诗\train.py", line 24, in <module>
tf.app.flags.DEFINE_integer('batch_size', 64, 'batch size.')
AttributeError: module 'tensorflow' has no attribute 'app'

2、模型训练及运行

环境搭建完成后,先执行python train.py命令训练模型。

模型训练完成后,执行python compose_poem.py开始诗歌创作:

看着像模像样,却终不能与前面提到的主流平台相论,诗的意蕴自不必说,更有时会放飞自我。

3、可能遇到的问题3.1 tf.placeholder() is not compatible with eager execution

具体报错内容如下:

(poemai) E:\workspace\02_Python\002_AI作诗>python train.py
Traceback (most recent call last):
File "E:\workspace\02_Python\002_AI作诗\train.py", line 87, in <module>
tf.app.run()
File "D:\anaconda3\envs\poemai\lib\site-packages\tensorflow\python\platform\app.py", line 36, in run
_run(main=main, argv=argv, flags_parser=_parse_flags_tolerate_undef)
File "D:\anaconda3\envs\poemai\lib\site-packages\absl\app.py", line 308, in run
_run_main(main, args)
File "D:\anaconda3\envs\poemai\lib\site-packages\absl\app.py", line 254, in _run_main
sys.exit(main(argv))
File "E:\workspace\02_Python\002_AI作诗\train.py", line 83, in main
run_training()
File "E:\workspace\02_Python\002_AI作诗\train.py", line 42, in run_training
input_data = tf.placeholder(tf.int32, [FLAGS.batch_size, None])
File "D:\anaconda3\envs\poemai\lib\site-packages\tensorflow\python\ops\array_ops.py", line 3340, in placeholder
raise RuntimeError("tf.placeholder() is not compatible with "
RuntimeError: tf.placeholder() is not compatible with eager execution.

原因分析:Tensorflow 2.0 会默认使用 Eager Execution这个功能,具体代码如下。这段代码会直接导致与tf.placeholder()这段代码冲突。

tf.compat.v1.enable_eager_execution()

解决方案:在tf.placeholder() 前面输入以下代码,使得功能先不生效。

tf.compat.v1.disable_eager_execution()

3.2 module 'tensorflow' has no attribute 'contrib'

具体报错内容如下:

(poemai) E:\workspace\02_Python\002_AI作诗>python train.py
Traceback (most recent call last):
File "E:\workspace\02_Python\002_AI作诗\train.py", line 88, in <module>
tf.app.run()
File "D:\anaconda3\envs\poemai\lib\site-packages\tensorflow\python\platform\app.py", line 36, in run
_run(main=main, argv=argv, flags_parser=_parse_flags_tolerate_undef)
File "D:\anaconda3\envs\poemai\lib\site-packages\absl\app.py", line 308, in run
_run_main(main, args)
File "D:\anaconda3\envs\poemai\lib\site-packages\absl\app.py", line 254, in _run_main
sys.exit(main(argv))
File "E:\workspace\02_Python\002_AI作诗\train.py", line 84, in main
run_training()
File "E:\workspace\02_Python\002_AI作诗\train.py", line 46, in run_training
end_points = rnn_model(model='lstm', input_data=input_data, output_data=output_targets, vocab_size=len(
File "E:\workspace\02_Python\002_AI作诗\poems\model.py", line 44, in rnn_model
cell_fun = tf.contrib.rnn.BasicLSTMCell
AttributeError: module 'tensorflow' has no attribute 'contrib'

原因分析:由于tensorflow2.x废弃了很多tensorflow1.x API接口,使用tensorflow2.x版本调用tensorflow1.x函数的代码时,常常会出现module ‘tensorflow’ has no attribute ‘contrib’这样的问题。如笔者的错误,因为tensorflow2.x版本已经没有contrib库,可以尝试下面的方法解决。

首先用placeholder的方法,先修改import tensorflow as tf 改成

import tensorflow.compat.v1 as tf
tf.compat.v1.disable_eager_execution()

BasicLSTMCell处理方法,DropoutWrapper和MultiRNNCell同理:

cell = tf.contrib.rnn.BasicLSTMCell(num_units=units, forget_bias=0.9)
修改为:
cell = tf.nn.rnn_cell.BasicLSTMCell(num_units=units,forget_bias=0.9)

将contrib.rnn 改成 nn.rnn_cell,如果使用了static_rnn类似的,就把contrib.rnn改成nn即可。

outputs, _ = tf.contrib.rnn.static_rnn(stacked_lstm_cells, inputs, dtype=tf.float32)
修改为:
outputs, _ = tf.nn.static_rnn(stacked_lstm_cells, inputs, dtype=tf.float32)