诗歌是一种艺术的表现形式,涉及到深厚的语言和情感。近年来,深度学习技术的发展让我们能够用机器来生成具有诗意的文字。今天带你一步一步地实现一个简单的诗歌生成模型,使用LSTM(长短期记忆网络)和GRU(门控循环单元),帮助你理解如何让机器学习写诗。
环境准备
首先,我们需要准备环境,确保可以在CPU模式下运行代码。你可以通过设置环境变量来禁用GPU,这样在没有GPU的机器上也能进行训练。
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
数据准备与预处理
我们的目标是生成中文诗歌,因此我们首先需要收集并处理数据。假设我们有一个名为 poems_clean.txt
的文件,其中包含了诗歌数据,每一行的格式为标题:诗歌内容
。我们需要读取这些数据并进行预处理:
import string
import numpy as np
from tensorflow.keras.optimizers import Adam
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
f = open('poems_clean.txt', "r", encoding='utf-8')
poems = []
for line in f.readlines():
title, poem = line.split(':')
poem = poem.replace(' ', '') # 去掉空格
poem = poem.replace('\n', '') # 去掉换行符
poems.append(list(poem))
文本编码
接下来,我们需要将文本数据转换为机器可以理解的数字形式。我们使用Tokenizer
来对文本进行编码,并将其转换为固定长度的序列:
tokenizer = Tokenizer()
tokenizer.fit_on_texts(poems)
poems_digit = tokenizer.texts_to_sequences(poems)
vocab_size = len(tokenizer.word_index) + 1 # 包括停止词0
poems_digit = pad_sequences(poems_digit, maxlen=50, padding='post')
创建输入和输出序列
为了训练模型,我们需要将数据分成输入和输出序列。我们的模型将基于前面的词来预测下一个词:
X = poems_digit[:, :-1]
Y = poems_digit[:, 1:]
from tensorflow.keras.utils import to_categorical
Y = to_categorical(Y, num_classes=vocab_size)
定义模型
我们将构建一个基于RNN的模型,使用SimpleRNN
作为示例。你也可以尝试使用LSTM
或GRU
,但在这个示例中,我们使用了SimpleRNN
:
from keras.models import Model
from keras.layers import Input, SimpleRNN, Dense, Embedding, Activation
embedding_size = 32
hidden_size = 64
inp = Input(shape=(49,))
x = Embedding(vocab_size, embedding_size, mask_zero=True)(inp)
x = SimpleRNN(hidden_size, return_sequences=True)(x)
x = Dense(vocab_size)(x)
pred = Activation('softmax')(x)
model = Model(inp, pred)
model.summary()
编译与训练模型
编译模型并进行训练。我们可以调整批次大小和训练轮数以优化模型性能:
model.compile(loss='categorical_crossentropy', optimizer=Adam(learning_rate=0.001), metrics=['accuracy'])
model.fit(X, Y, epochs=10, batch_size=32, validation_split=0.2)
生成诗歌
模型训练完毕后,我们可以用它来生成诗歌。我们将从一个初始的“诗句”开始,并逐步预测后续的字符:此处四字为藏头
poem_incomplete = '藏****头****诗****换****'
poem_index = []
poem_text = ''
for i in range(len(poem_incomplete)):
current_word = poem_incomplete[i]
if current_word != '*':
index = tokenizer.word_index[current_word]
else:
x = np.expand_dims(poem_index, axis=0)
x = pad_sequences(x, maxlen=49, padding='post')
y = model.predict(x)[0, i]
y[0] = 0 # 去掉停止词
index = y.argmax()
current_word = tokenizer.index_word[index]
poem_index.append(index)
poem_text = poem_text + current_word
poem_text = poem_text[0:]
print(poem_text[0:5])
print(poem_text[5:10])
print(poem_text[10:15])
print(poem_text[15:20])
总结
以上步骤展示了如何利用LSTM和GRU生成诗歌。这里使用了简单的RNN,你可以通过使用LSTM或GRU来改善生成的质量。希望这篇教程能帮助你了解如何用深度学习来创作诗歌