本文将详细介绍一个在文本分类领域广受好评的经典模型——基于TensorFlow的卷积神经网络(CNN)实现。该代码参考了Kim的论文《Convolutional Neural Networks for Sentence Classification》的简化版本,经过多个实际项目验证,非常适合作为文本分类入门或快速原型开发的基准。



前置准备
在运行代码前,请确保环境已安装以下依赖:Python 3、TensorFlow 0.12及以上版本,以及NumPy。这些库都是必需的,尤其注意TensorFlow版本,过旧或过新都可能导致兼容性问题。建议使用Python 3.6+搭配TensorFlow 1.x的稳定版本。
训练模型
训练脚本的核心文件为train.py,该脚本支持多种参数以灵活调整模型结构。以下是常用配置项说明:
- --embedding_dim:词嵌入维度,默认128。该参数控制每个词向量的长度,数值越大表示能力越强,但训练成本也随之增加。
- --filter_sizes:卷积核尺寸,以逗号分隔,默认"3,4,5"。这些尺寸对应n-gram窗口大小,通常选择3、4、5。
- --num_filters:每种尺寸的卷积核数量,默认128。数量越多,模型提取的特征越丰富,但需注意过拟合风险。
- --l2_reg_lambda:L2正则化系数,默认0.0。实际应用中建议设置为较小值,如0.01,可有效防止参数爆炸。
- --dropout_keep_prob:Dropout保留概率,默认0.5。训练时通常设为0.5~0.8,评估时设为1.0。
- --batch_size:批量大小,默认64。若显存充足,可尝试128以提高训练速度。
- --num_epochs:训练轮数,默认100。实际轮次需根据验证集表现调整,通常50~100轮即可收敛。
- --evaluate_every:评估间隔步数,默认100步。可根据模型大小调整频率。
- --checkpoint_every:模型保存间隔步数,默认100步。建议与评估步数一致,便于对比。
- --allow_soft_placement 和 --log_device_placement:这两个与设备相关的参数通常保持默认,无需特殊设置。
启动训练的命令非常简单:
./train.py
如果想自定义参数,比如改成128维嵌入、过滤器尺寸为3,4,5、每类过滤器128个,可以这样:
./train.py --embedding_dim 128 --filter_sizes "3,4,5" --num_filters 128
模型评估
训练结束后,可使用eval.py脚本评估模型性能。执行时需指定检查点(checkpoint)目录路径,例如:
./eval.py --eval_train --checkpoint_dir="./runs/1459637919/checkpoints/"
请将路径替换为实际训练输出目录。若要使用自定义数据集,需修改eval.py中的数据加载部分,代码已预留接口,可根据数据集格式进行相应调整。
参考资料
若想深入理解原理,建议阅读以下两篇论文:
- Kim Y. Convolutional Neural Networks for Sentence Classification. EMNLP, 2014.
- Zhang Y., Wallace B. A Sensitivity Analysis of (and Practitioners' Guide to) Convolutional Neural Networks for Sentence Classification. arXiv, 2015.
第一篇论文是开创性工作,第二篇提供了大量实践调参建议和敏感性分析,对实际部署极具参考价值。
