1. 项目概述:基于GRU的英文诗歌生成系统
作为一名长期从事AI项目开发的工程师,我最近完成了一个结合深度学习与文学创作的毕业设计项目——基于GRU神经网络的英文诗歌生成系统。这个项目不仅具有学术价值,还能为诗歌爱好者提供创作灵感。不同于传统的规则式诗歌生成器,我们采用深度学习技术让系统学会"创作"具有文学美感的英文诗歌。
在实际开发中,这个系统主要解决了三个核心问题:
- 如何让机器理解诗歌的韵律和情感特征
- 如何设计网络结构来捕捉诗歌的长期依赖关系
- 如何构建用户友好的交互界面
系统最终实现了从用户输入主题词自动生成多段式英文诗歌的功能,生成的诗歌在语法正确性和文学性上都达到了不错的水准。下面我将详细分享这个项目的技术实现细节和开发经验。
2. 系统架构设计
2.1 整体技术栈选择
在技术选型上,我们采用了前后端分离的架构模式:
后端技术栈:
- 框架:Spring Boot 2.7 + MyBatis Plus
- 深度学习:Python 3.8 + TensorFlow 2.6
- 数据库:MySQL 8.0
- 接口:RESTful API
前端技术栈:
- 框架:Vue 3 + Element Plus
- 构建工具:Vite
- 可视化:ECharts
选择这套技术栈主要基于以下考虑:
- Spring Boot提供了快速开发企业级应用的能力,内置Tomcat简化部署
- Vue 3的Composition API更适合复杂前端状态的维护
- TensorFlow 2.x对GRU等RNN网络有良好的支持
- MySQL作为成熟的关系型数据库,能满足诗歌语料存储需求
2.2 系统架构图
系统采用典型的三层架构:
code复制[前端界面] ←HTTP→ [Spring Boot后端] ←JDBC→ [MySQL数据库]
↑
[Python模型服务] ←gRPC→
这种架构的优势在于:
- 前后端完全解耦,可独立开发和部署
- Python负责计算密集型任务,Java负责业务逻辑
- gRPC保证了模型服务调用的高效性
3. 核心算法实现
3.1 GRU网络结构设计
GRU(Gated Recurrent Unit)是LSTM的一种变体,在保持相似性能的同时结构更简单。我们的GRU模型结构如下:
python复制model = tf.keras.Sequential([
tf.keras.layers.Embedding(vocab_size, 256),
tf.keras.layers.GRU(1024, return_sequences=True),
tf.keras.layers.Dropout(0.3),
tf.keras.layers.GRU(512),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(vocab_size)
])
关键参数说明:
- Embedding层维度:256(平衡表达能力和计算成本)
- 第一层GRU单元数:1024(捕捉长期依赖)
- 第二层GRU单元数:512(提取高层特征)
- Dropout率:0.3(防止过拟合)
3.2 诗歌生成算法
诗歌生成采用基于温度采样的方法:
python复制def generate_poem(start_string, temperature=0.7):
input_eval = [char2idx[s] for s in start_string]
input_eval = tf.expand_dims(input_eval, 0)
text_generated = []
model.reset_states()
for i in range(1000): # 最大生成长度
predictions = model(input_eval)
predictions = tf.squeeze(predictions, 0)
predictions = predictions / temperature
predicted_id = tf.random.categorical(predictions, num_samples=1)[-1,0].numpy()
text_generated.append(idx2char[predicted_id])
input_eval = tf.expand_dims([predicted_id], 0)
if text_generated[-1] == '\n\n': # 双换行符结束
break
return (start_string + ''.join(text_generated))
温度参数的作用:
- temperature < 1.0:生成更保守、可预测的文本
- temperature > 1.0:生成更多样化、更有创意的文本
4. 数据集准备与处理
4.1 诗歌语料收集
我们收集了以下英文诗歌数据集:
- Gutenberg诗歌集(约5,000首)
- 现代英文诗歌数据集(约3,000首)
- 莎士比亚十四行诗(154首)
总计约10MB的纯文本数据,包含多种诗歌形式和风格。
4.2 数据预处理流程
python复制def preprocess_text(text):
text = text.lower() # 统一小写
text = re.sub(r'[^\w\s]', '', text) # 移除标点
text = re.sub(r'\d+', '', text) # 移除数字
words = text.split()
words = [word for word in words if word not in stop_words] # 移除停用词
return ' '.join(words)
处理后的数据格式示例:
code复制shall i compare thee to a summers day
thou art more lovely and more temperate
rough winds do shake the darling buds of may
and summers lease hath all too short a date
4.3 数据增强技巧
为提高模型表现,我们采用了以下数据增强方法:
- 行顺序随机打乱(保持诗歌结构)
- 同义词替换(使用WordNet)
- 随机插入(添加不影响语义的修饰词)
- 随机交换(相邻行交换位置)
5. 模型训练与优化
5.1 训练参数配置
python复制model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
history = model.fit(dataset, epochs=50, callbacks=[
tf.keras.callbacks.EarlyStopping(patience=3),
tf.keras.callbacks.ModelCheckpoint('best_model.h5')
])
关键训练参数:
- 优化器:Adam (lr=0.001)
- Batch size:64
- Epochs:50(实际早停约在35轮)
- 损失函数:SparseCategoricalCrossentropy
5.2 训练过程可视化
训练过程中的损失和准确率曲线:
code复制Epoch 1/50
loss: 3.5123 - accuracy: 0.3125
Epoch 2/50
loss: 2.9872 - accuracy: 0.3568
...
Epoch 35/50
loss: 1.0235 - accuracy: 0.7123
从曲线可以看出:
- 前10个epoch模型快速收敛
- 10-25epoch进入平稳提升期
- 25epoch后开始出现过拟合迹象
5.3 超参数调优经验
我们使用Optuna进行了超参数优化,最佳组合为:
- GRU层数:2层
- 隐藏单元数:1024+512
- Dropout率:0.3
- 学习率:0.001
- Batch size:64
调优过程中的发现:
- 超过3层GRU会导致梯度消失
- Dropout低于0.2容易过拟合
- Batch size大于128会降低生成质量
6. 系统功能实现
6.1 诗歌生成核心逻辑
java复制@RestController
@RequestMapping("/api/poem")
public class PoemController {
@Autowired
private PythonService pythonService;
@PostMapping("/generate")
public ResponseEntity<String> generatePoem(
@RequestParam String theme,
@RequestParam(defaultValue = "0.7") float temperature) {
try {
String poem = pythonService.generatePoem(theme, temperature);
return ResponseEntity.ok(poem);
} catch (Exception e) {
return ResponseEntity.status(500).body("生成失败");
}
}
}
6.2 前端交互设计
前端主要功能点:
- 主题词输入框
- 创意度调节滑块(控制temperature)
- 生成历史记录
- 诗歌收藏功能
- 格式美化选项
关键Vue组件:
vue复制<template>
<div class="generator">
<el-input v-model="theme" placeholder="输入主题词"></el-input>
<el-slider v-model="temperature" :min="0.1" :max="1.5" step="0.1"></el-slider>
<el-button @click="generate">生成诗歌</el-button>
<div class="poem-display">{{ poem }}</div>
</div>
</template>
6.3 数据库设计
主要表结构:
sql复制CREATE TABLE `poems` (
`id` int NOT NULL AUTO_INCREMENT,
`content` text NOT NULL,
`theme` varchar(100) NOT NULL,
`created_at` datetime NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `users` (
`id` int NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `favorites` (
`user_id` int NOT NULL,
`poem_id` int NOT NULL,
PRIMARY KEY (`user_id`,`poem_id`)
);
7. 系统测试与评估
7.1 功能测试用例
| 测试项 | 输入 | 预期输出 | 实际结果 |
|---|---|---|---|
| 正常生成 | "love" | 关于爱的诗歌 | 符合预期 |
| 空输入 | "" | 错误提示 | 显示"请输入主题" |
| 长主题 | 50字符主题 | 截断处理 | 自动截断前30字符 |
| 极端temperature | 2.0 | 创意性文本 | 出现不合语法但富有创意的句子 |
7.2 生成质量评估
我们采用人工评估方式,邀请10位英语专业学生评分(1-5分):
| 评估维度 | 平均分 |
|---|---|
| 语法正确性 | 4.2 |
| 韵律美感 | 3.8 |
| 主题相关性 | 4.1 |
| 创意性 | 3.5 |
7.3 性能测试结果
使用JMeter进行压力测试:
| 并发用户数 | 平均响应时间 | 错误率 |
|---|---|---|
| 50 | 320ms | 0% |
| 100 | 450ms | 0% |
| 200 | 680ms | 1.2% |
| 500 | 1200ms | 3.5% |
8. 项目部署方案
8.1 生产环境配置
推荐服务器配置:
- CPU: 4核以上(建议8核)
- 内存: 16GB+
- GPU: NVIDIA T4或以上(可选)
- 存储: 100GB SSD
8.2 Docker部署
后端Dockerfile示例:
dockerfile复制FROM openjdk:11
COPY target/poem-generator.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
模型服务Dockerfile:
dockerfile复制FROM tensorflow/tensorflow:2.6.0-gpu
COPY model /app/model
COPY service.py /app/
WORKDIR /app
CMD ["python", "service.py"]
8.3 性能优化建议
- 使用Redis缓存热门主题的生成结果
- 对模型服务进行水平扩展
- 启用Gzip压缩API响应
- 使用Nginx负载均衡
9. 常见问题与解决方案
9.1 生成诗歌重复率高
问题现象:相同主题多次生成结果相似
解决方案:
- 增加temperature值(0.8-1.2)
- 在输入主题后添加随机后缀
- 使用top-k采样替代temperature采样
9.2 生成长诗时逻辑断裂
问题现象:超过10行的诗歌会出现主题偏离
解决方案:
- 分段生成后拼接
- 加入主题一致性损失函数
- 使用层次化GRU结构
9.3 用户界面响应慢
问题现象:生成诗歌时界面卡顿
优化措施:
- 添加加载动画
- 实现流式生成(逐行返回)
- 前端使用Web Worker
10. 项目扩展方向
基于现有系统,可以考虑以下扩展:
- 多语言支持:加入中文、法语等诗歌生成
- 风格控制:选择生成莎士比亚风格或现代风格
- 协作创作:人机交互式诗歌创作
- 情感分析:根据用户心情生成相应情绪的诗歌
- 移动应用:开发iOS/Android客户端
在实际开发中,我发现GRU网络虽然比LSTM简单,但在诗歌生成这种序列不长但要求创意性的任务上表现相当不错。一个实用的建议是在训练时加入一些现代流行歌曲的歌词,这能显著提升生成结果的流畅度和现代感。