文章目录

一、前期工作
1. 设置GPU
2. 导入预处理词库类
二、导入预处理词库类
三、参数设定
四、创建模型
五、训练模型函数
六、测试模型函数
七、训练模型与预测

今天给大家带来一个简单的中文新闻分类模型,利用TextCNN模型进行训练,TextCNN的主要流程是:获取文本的局部特征:通过不同的卷积核尺寸来提取文本的N-Gram信息,然后通过最大池化操作来突出各个卷积操作提取的最关键信息,拼接后通过全连接层对特征进行组合,最后通过交叉熵损失函数来训练模型。
注:N-Gram是大词汇连续语音识别中常用的一种语言模型。⼜被称为⼀阶马尔科夫链。它的基本思想是将⽂本⾥⾯的内容按照字节进行大小为 N 的滑动窗⼝操作,形成了长度是 N 的字节⽚段序列。每⼀个字节⽚段称为 gram,对所有的 gram 的出现频度进⾏统计,并且按照事先设定好的阈值进⾏过滤,形成关键 gram 列表,是这个⽂本的向量特征空间。列表中的每⼀种 gram 就是⼀个特征向量维度。

一、前期工作

1. 设置GPU

如果使用的是CPU可以注释掉这部分的代码。

import tensorflow as tf
gpus = tf.config.list_physical_devices("GPU")if gpus:gpu0 = gpus[0] #如果有多个GPU,仅使用第0个GPUtf.config.experimental.set_memory_growth(gpu0, True) #设置GPU显存用量按需使用tf.config.set_visible_devices([gpu0],"GPU")#导入库包
import tensorflow.keras as keras
from config import Config
import os
from sklearn import metrics
import numpy as np
from keras.models import Sequential
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Embedding,Dropout,Conv1D,ReLU,GlobalMaxPool1D,InputLayer

2. 导入预处理词库类

trainingSet_path = "cnews.train.txt"
valSet_path = "cnews.val.txt"
model_save_path = "CNN_model.h5"
testingSet_path = "cnews.test.txt"#创建 文本处理类:preprocesser
class preprocesser(object):def __init__(self):self.config = Config()# 读取文本txt 函数def read_txt(self, txt_path):with open(txt_path, "r", encoding='utf-8') as f:data = f.readlines()labels = []contents = []for line in data:label, content = line.strip().split('\t')labels.append(label)contents.append(content)return labels, contents# 读取分词文档def get_vocab_id(self):vocab_path = "cnews.vocab.txt"with open(vocab_path, "r", encoding="utf-8") as f:infile = f.readlines()vocabs = list([word.replace("\n", "") for word in infile])vocabs_dict = dict(zip(vocabs, range(len(vocabs))))return vocabs, vocabs_dict# 获取新闻属性id 函数def get_category_id(self):categories = ["体育", "财经", "房产", "家居", "教育", "科技", "时尚", "时政", "游戏", "娱乐"]cates_dict = dict(zip(categories, range(len(categories))))return cates_dict#将语料中各文本转换成固定max_length后返回各文本的标签与文本tokensdef word2idx(self, txt_path, max_length):# vocabs:分词词汇表# vocabs_dict:各分词的索引vocabs, vocabs_dict = self.get_vocab_id()# cates_dict:各分类的索引cates_dict = self.get_category_id()# 读取语料labels, contents = self.read_txt(txt_path)# labels_idx:用来存放语料中的分类labels_idx = []# contents_idx:用来存放语料中各样本的索引contents_idx = []# 遍历语料for idx in range(len(contents)):# tmp:存放当前语句indextmp = []# 将该idx(样本)的标签加入至labels_idx中labels_idx.append(cates_dict[labels[idx]])# contents[idx]:为该语料中的样本遍历项# 遍历contents中各词并将其转换为索引后加入contents_idx中for word in contents[idx]:if word in vocabs:tmp.append(vocabs_dict[word])else:# 第5000位设置为未知字符tmp.append(5000)# 将该样本index后结果存入contents_idx作为结果等待传回contents_idx.append(tmp)# 将各样本长度pad至max_lengthx_pad = keras.preprocessing.sequence.pad_sequences(contents_idx, max_length)y_pad = keras.utils.to_categorical(labels_idx, num_classes=len(cates_dict))return x_pad, y_paddef word2idx_for_sample(self, sentence, max_length):# vocabs:分词词汇表# vocabs_dict:各分词的索引vocabs, vocabs_dict = self.get_vocab_id()result = []# 遍历语料for word in sentence:# tmp:存放当前语句indexif word in vocabs:result.append(vocabs_dict[word])else:# 第5000位设置为未知字符,实际中为vocabs_dict[5000],使得vocabs_dict长度变成len(vocabs_dict+1)result.append(5000)x_pad = keras.preprocessing.sequence.pad_sequences([result], max_length)return x_padpre = preprocesser() # 实例化preprocesser()类

数据集样式:

二、参数设定

num_classes = 10     # 类别数
vocab_size = 5000    #语料词大小
seq_length = 600     #词长度conv1_num_filters = 128   # 第一层输入卷积维数
conv1_kernel_size = 1     # 卷积核数conv2_num_filters = 64   # 第二层输入卷维数
conv2_kernel_size = 1    # 卷积核数hidden_dim = 128         # 隐藏层维度
dropout_keep_prob = 0.5  # dropout层丢弃0.5batch_size = 64     # 每次训练批次数  

四、创建模型

def TextCNN():#创建模型序列model = Sequential()model.add(InputLayer((seq_length,)))model.add(Embedding(vocab_size+1, 256, input_length=seq_length))model.add(Conv1D(conv1_num_filters, conv1_kernel_size, padding="SAME"))model.add(Conv1D(conv2_num_filters, conv2_kernel_size, padding="SAME"))model.add(GlobalMaxPool1D())model.add(Dense(hidden_dim))model.add(Dropout(dropout_keep_prob))model.add(ReLU())model.add(Dense(num_classes, activation="softmax"))model.compile(loss="categorical_crossentropy",optimizer="adam",metrics=["acc"])print(model.summary())return model

五、训练模型函数

def train(epochs):model = TextCNN()model.summary()x_train, y_train = pre.word2idx(trainingSet_path, max_length=seq_length)x_val, y_val = pre.word2idx(valSet_path, max_length=seq_length)model.fit(x_train, y_train,batch_size=batch_size,epochs=epochs,validation_data=(x_val, y_val))model.save(model_save_path, overwrite=True)

六、测试模型函数

def test():if os.path.exists(model_save_path):model = keras.models.load_model(model_save_path)print("-----model loaded-----")model.summary()x_test, y_test = pre.word2idx(testingSet_path, max_length=seq_length)print(x_test.shape)print(type(x_test))print(y_test.shape)# print(type(y_test))pre_test = model.predict(x_test)# print(pre_test.shape)# metrics.classification_report(np.argmax(pre_test, axis=1), np.argmax(y_test, axis=1), digits=4, output_dict=True)print(metrics.classification_report(np.argmax(pre_test, axis=1), np.argmax(y_test, axis=1)))

七、训练模型与预测

if __name__ == '__main__':train(20)  # 训练模型Epoch 1/20
782/782 [==============================] - 119s 152ms/step - loss: 0.7380 - accuracy: 0.7696 - val_loss: 0.5568 - val_accuracy: 0.8334
Epoch 2/20
782/782 [==============================] - 122s 156ms/step - loss: 0.3898 - accuracy: 0.8823 - val_loss: 0.4342 - val_accuracy: 0.8588
Epoch 3/20
782/782 [==============================] - 121s 154ms/step - loss: 0.3382 - accuracy: 0.8979 - val_loss: 0.4154 - val_accuracy: 0.8648
Epoch 4/20
782/782 [==============================] - 116s 148ms/step - loss: 0.3091 - accuracy: 0.9055 - val_loss: 0.4408 - val_accuracy: 0.8688
Epoch 5/20
782/782 [==============================] - 117s 150ms/step - loss: 0.2904 - accuracy: 0.9116 - val_loss: 0.3880 - val_accuracy: 0.8844
Epoch 6/20
782/782 [==============================] - 119s 153ms/step - loss: 0.2724 - accuracy: 0.9153 - val_loss: 0.4412 - val_accuracy: 0.8664
Epoch 7/20
782/782 [==============================] - 117s 149ms/step - loss: 0.2601 - accuracy: 0.9206 - val_loss: 0.4217 - val_accuracy: 0.8726
Epoch 8/20
782/782 [==============================] - 116s 149ms/step - loss: 0.2423 - accuracy: 0.9243 - val_loss: 0.4205 - val_accuracy: 0.8760
Epoch 9/20
782/782 [==============================] - 117s 150ms/step - loss: 0.2346 - accuracy: 0.9275 - val_loss: 0.4022 - val_accuracy: 0.8808
Epoch 10/20
782/782 [==============================] - 116s 148ms/step - loss: 0.2249 - accuracy: 0.9301 - val_loss: 0.4297 - val_accuracy: 0.8726
....model = keras.models.load_model(model_save_path)print("-----model loaded-----")model.summary()test = preprocesser()# 测试文本x_test = '5月6日,上海莘庄基地田径特许赛在第二体育运动学校鸣枪开赛。男子110米栏决赛,19岁崇明小囡秦伟搏以13.35秒的成绩夺冠,创造本赛季亚洲最佳。谢文骏迎来赛季首秀,以13.38秒获得亚军'x_test = test.word2idx_for_sample(x_test, 600)categories = ["体育", "财经", "房产", "家居", "教育", "科技", "时尚", "时政", "游戏", "娱乐"]pre_test = model.predict(x_test)index = int(np.argmax(pre_test, axis=1)[0])print('该新闻为:', categories[index])

训练20次后,训练集损失函数loss: 0.1635 ,训练集准确率:accuracy: 0.9462

验证集函数:val_loss: 0.4554 验证集准确率 val_accuracy: 0.8820

运行结果:该新闻为: 体育

往期作品:

深度学习实战项目

1.深度学习实战1-(keras框架)企业数据分析与预测

2.深度学习实战2-(keras框架)企业信用评级与预测

3.深度学习实战3-文本卷积神经网络(TextCNN)新闻文本分类

4.深度学习实战4-卷积神经网络(DenseNet)数学图形识别+题目模式识别

5.深度学习实战5-卷积神经网络(CNN)中文OCR识别项目

6.深度学习实战6-卷积神经网络(Pytorch)+聚类分析实现空气质量与天气预测

7.深度学习实战7-电商产品评论的情感分析

8.深度学习实战8-生活照片转化漫画照片应用

9.深度学习实战9-文本生成图像-本地电脑实现text2img

10.深度学习实战10-数学公式识别-将图片转换为Latex(img2Latex)

11.深度学习实战11(进阶版)-BERT模型的微调应用-文本分类案例

12.深度学习实战12(进阶版)-利用Dewarp实现文本扭曲矫正

13.深度学习实战13(进阶版)-文本纠错功能,经常写错别字的小伙伴的福星

14.深度学习实战14(进阶版)-手写文字OCR识别,手写笔记也可以识别了

15.深度学习实战15(进阶版)-让机器进行阅读理解+你可以变成出题者提问

16.深度学习实战16(进阶版)-虚拟截图识别文字-可以做纸质合同和表格识别

17.深度学习实战17(进阶版)-智能辅助编辑平台系统的搭建与开发案例

18.深度学习实战18(进阶版)-NLP的15项任务大融合系统,可实现市面上你能想到的NLP任务

19.深度学习实战19(进阶版)-ChatGPT的本地实现部署测试,自己的平台就可以实现ChatGPT

...(待更新)

深度学习实战3-文本卷积神经网络(TextCNN)新闻文本分类相关推荐

  1. 深度学习时间序列预测:卷积神经网络(CNN)算法构建单变量时间序列预测模型预测空气质量(PM2.5)+代码实战

    深度学习时间序列预测:卷积神经网络(CNN)算法构建单变量时间序列预测模型预测空气质量(PM2.5)+代码实战 神经网络(neual networks)是人工智能研究领域的一部分,当前最流行的神经网络 ...

  2. Keras深度学习实战(1)——神经网络基础与模型训练过程详解

    Keras深度学习实战(1)--神经网络基础与模型训练过程详解 0. 前言 1. 神经网络基础 1.1 简单神经网络的架构 1.2 神经网络的训练 1.3 神经网络的应用 2. 从零开始构建前向传播 ...

  3. 深度学习笔记其五:卷积神经网络和PYTORCH

    深度学习笔记其五:卷积神经网络和PYTORCH 1. 从全连接层到卷积 1.1 不变性 1.2 多层感知机的限制 1.2.1 平移不变性 1.2.2 局部性 1.3 卷积 1.4 "沃尔多在 ...

  4. 【深度学习】Tensorflow搭建卷积神经网络实现情绪识别

    [深度学习]Tensorflow搭建卷积神经网络实现情绪识别 文章目录 1 Tensorflow的基本使用方法1.1 计算图1.2 Feed1.3 Fetch1.4 其他解释 2 训练一个Tensor ...

  5. 花书+吴恩达深度学习(十三)卷积神经网络 CNN 之运算过程(前向传播、反向传播)

    目录 0. 前言 1. 单层卷积网络 2. 各参数维度 3. CNN 前向传播反向传播 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~ 花书+吴恩达深度学习(十)卷积神经网络 ...

  6. 花书+吴恩达深度学习(十一)卷积神经网络 CNN 之池化层

    目录 0. 前言 1. 最大池化(max pooling) 2. 平移不变形 3. 其他池化函数 4. 卷积和池化作为一种无限强的先验 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常 ...

  7. 花书+吴恩达深度学习(十)卷积神经网络 CNN 之卷积层

    目录 0. 前言 1. 2D 图像卷积 2. 3D 图像卷积 3. 过滤器(核函数) 4. 过滤器应用于边缘检测 5. padding 填充 6. stride 步长 7. 使用卷积的动机 8. 1乘 ...

  8. 图像处理神经网络python_深度学习使用Python进行卷积神经网络的图像分类教程

    深度学习使用Python进行卷积神经网络的图像分类教程 好的,这次我将使用python编写如何使用卷积神经网络(CNN)进行图像分类.我希望你事先已经阅读并理解了卷积神经网络(CNN)的基本概念,这里 ...

  9. Keras深度学习实战(3)——神经网络性能优化技术详解

    Keras深度学习实战(3)--神经网络性能优化技术详解 0. 前言 1. 缩放输入数据集 1.1 数据集缩放的合理性解释 1.2 使用缩放后的数据集训练模型 2. 输入值分布对模型性能的影响 3. ...

最新文章

  1. boost::ratio_negate相关的测试程序
  2. 【转】datagridview的checkbox列,当修改checkbox状态时实时获得其准确状态值
  3. C# 8: 可变结构体中的只读实例成员
  4. 【APICloud系列|37】百度开放平台应用+,提升用户下载量操作步骤
  5. 考研 | 先预览一下考研真题是考研小白最快的入门方法(含21考研最新真题)
  6. js 网页嵌套在div的方法
  7. 常见CSS选择器分类
  8. HTTPS反向代理嗅探
  9. google java. 集合_google guava集合之Table
  10. 高斯克吕格投影 python2.x 版本
  11. 用放大镜看计算机屏幕,使用放大镜可使屏幕上的内容更易于查看
  12. 如何在微信公众号优雅地添加代码
  13. node.js、React和VUE的纯理论
  14. 清明时节雨纷纷路-清明节习俗、诗词欣赏
  15. 服务器虚拟机系统速度,虚拟主机的快慢与什么有关系
  16. WordPress – wp-rocket插件的简单设置以及如何加速网站
  17. 计算机风扇介绍,如何选择计算机风扇?
  18. java正态分布随机数_正态分布的随机数
  19. mysql5.6 rpm安装配置
  20. 关于网页前端中的 outline轮廓

热门文章

  1. 华为平板连接linux服务器,大疆造了台android平板_连华为平板都连不上大疆
  2. 关于opencv使用CAP_PROP_FPS得到的摄像头帧率为0的解答和解决方案
  3. 在IDEA中设置使用鼠标滚轮控制字体大小
  4. 不要浪费你最宝贵的财富——青春
  5. 科沃斯扫地机器人电池哪里买_科沃斯扫地机器人的电池是什么电池
  6. AidLux中正确使用Wayland的方式
  7. 阿里云GPU服务器多少钱一台?
  8. 大学试卷哪里找?直到挂科才知道
  9. 智慧兔哲理漫画《触摸你的温柔》
  10. 如何像高手一样深度思考?