CNN文本分类(tensorflow实现)

前言
  • 实现步骤

    • 1.安装tensorflow
    • 2.导入所需要的tensorflow库和其它相关模块
    • 3.设置随机种子
    • 4.定义模型相关超参数
    • 5.加载需要的数据集
    • 6.对加载的文本内容进行填充和截断
    • 7.构建自己模型
    • 8.训练构建的模型
    • 9.评估完成的模型
  • CNN(卷积神经网络)在文本分类任务中具有良好的特征提取能力、位置不变性、参数共享和处理大规模数据的优势,能够有效地学习文本的局部和全局特征,提高模型性能和泛化能力,所以本文将以CNN实现文本分类。

    CNN对文本分类的支持主要提现在:

    特征提取:CNN能够有效地提取文本中的局部特征。卷积层通过应用多个卷积核来捕获不同大小的n-gram特征,从而能够识别关键词、短语和句子结构等重要信息。

    位置不变性:对于文本分类任务,特征的位置通常是不重要的。CNN中的池化层(如全局最大池化)能够保留特征的最显著信息,同时忽略其具体位置,这对于处理可变长度的文本输入非常有帮助。

    参数共享:CNN中的卷积核在整个输入上共享参数,这意味着相同的特征可以在不同位置进行识别。这种参数共享能够极大地减少模型的参数量,降低过拟合的风险,并加快模型的训练速度。

    处理大规模数据:CNN可以高效地处理大规模的文本数据。由于卷积和池化操作的局部性质,CNN在处理文本序列时具有较小的计算复杂度和内存消耗,使得它能够适应大规模的文本分类任务。

    上下文建模:通过使用多个卷积核和不同的大小,CNN可以捕捉不同尺度的上下文信息。这有助于提高模型对文本的理解能力,并能够捕捉更长范围的依赖关系。

    实现步骤之前首先安装完成tensorflow
  • 使用这个代码安装的前提是你的深度学习已经环境存在

  • 例如:conda、pytorch、cuda、cudnn等环境

复制代码
  conda create -n tf python=3.8
  conda activate tf
  #tensorflow的安装
  pip install tensorflow-gpu -i https://pypi.douban.com/simple

一. 测试tensorflow是否安装成功

  • 有三种方法

  • 方法一:

    import tensorflow as tf
    print(tf.version)
    #输出'2.0.0-alpha0'
    print(tf.test.is_gpu_available())
    #会输出True,则证明安装成功

    #新版本的tf把tf.test.is_gpu_available()换成如下命令
    import tensorflow as tf
    tf.config.list_physical_devices('GPU')

  • 方法二:

复制代码
  import tensorflow as tf 
  with tf.device('/GPU:0'):
      a = tf.constant(3)

方法三:
*

复制代码
  #输入python,进入python环境
  import tensorflow as tf
  #查看tensorflow版本
  print(tf.__version__)
  #输出'2.0.0-alpha0'
  #测试GPU能否调用,先查看显卡使用情况
  import os 
  os.system("nvidia-smi")
  #调用显卡
  @tf.function
  def f():
  	pass
  f()
  #这时会打印好多日志
  #再次查询显卡
  os.system("nvidia-smi")
  可以对比两次使用情况

二、打开pycharm倒入你创建的tf环境,新建py文件开始构建代码

1.导入所需的库和模块:

复制代码
import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing import sequence
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Embedding, Conv1D, GlobalMaxPooling1D

其中提前安装TensorFlow来用于构建和训练模型,以及Keras中的各种层和模型类

2.设置随机种子:

复制代码
np.random.seed(42)

在CNN(卷积神经网络)中设置随机种子主要是为了保证实验的可重复性。由于深度学习模型中涉及大量的随机性,如权重的初始化、数据的打乱(shuffle)等,设置随机种子可以使得每次实验的随机过程都保持一致,从而使得实验结果可以复现

3.定义模型超参数:

复制代码
max_features = 5000  # 词汇表大小
max_length = 100  # 文本最大长度
embedding_dims = 50  # 词嵌入维度
filters = 250  # 卷积核数量
kernel_size = 3  # 卷积核大小
hidden_dims = 250  # 全连接层神经元数量
batch_size = 32  # 批处理大小
epochs = 5  # 训练迭代次数

超参数影响模型的结构和训练过程,可自行调整。

4.加载数据集:

复制代码
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.imdb.load_data(num_words=max_features)

示例中,使用的IMDB电影评论数据集,其中包含以数字表示的评论文本和相应的情感标签(正面或负面),使用tf.keras.datasets.imdb.load_data函数可以方便地加载数据集,并指定num_words参数来限制词汇表的大小。

5.对文本进行填充和截断:

复制代码
x_train = sequence.pad_sequences(x_train, maxlen=max_length)
x_test = sequence.pad_sequences(x_test, maxlen=max_length)

由于每条评论的长度可能不同,需要将它们统一到相同的长度。sequence.pad_sequences函数用于在文本序列前后进行填充或截断,使它们具有相同的长度。

6.构建模型:

复制代码
model = Sequential()
model.add(Embedding(max_features, embedding_dims, input_length=max_length))
model.add(Dropout(0.2))
model.add(Conv1D(filters, kernel_size, padding='valid', activation='relu', strides=1))
model.add(GlobalMaxPooling1D())
model.add(Dense(hidden_dims, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid'))

这个模型使用Sequential模型类构建,依次添加了嵌入层(Embedding)、卷积层(Conv1D)、全局最大池化层(GlobalMaxPooling1D)和两个全连接层(Dense)。嵌入层将输入的整数序列转换为固定维度的词嵌入表示,卷积层通过应用多个卷积核来提取特征,全局最大池化层获取每个特征通道的最大值,而两个全连接层用于分类任务。

7.编译模型:

复制代码
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

在编译模型之前,需要指定损失函数、优化器和评估指标。使用二元交叉熵作为损失函数,Adam优化器进行参数优化,并使用准确率作为评估指标。

8.训练模型:

复制代码
model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(x_test, y_test))

使用fit函数对模型进行训练。需要传入训练数据、标签,批处理大小、训练迭代次数,并可以指定验证集进行模型性能评估。

9.评估模型:

复制代码
scores = model.evaluate(x_test, y_test, verbose=0)
print("Test accuracy:", scores[1])

使用evaluate函数评估模型在测试集上的性能,计算并打印出测试准确率。

完整代码

复制代码
import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing import sequence
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Embedding, Conv1D, GlobalMaxPooling1D

# 设置随机种子
np.random.seed(42)

# 定义模型超参数
max_features = 5000  # 词汇表大小
max_length = 100  # 文本最大长度
embedding_dims = 50  # 词嵌入维度
filters = 250  # 卷积核数量
kernel_size = 3  # 卷积核大小
hidden_dims = 250  # 全连接层神经元数量
batch_size = 32  # 批处理大小
epochs = 5  # 训练迭代次数

# 加载数据集
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.imdb.load_data(num_words=max_features)

# 对文本进行填充和截断,使其具有相同的长度
x_train = sequence.pad_sequences(x_train, maxlen=max_length)
x_test = sequence.pad_sequences(x_test, maxlen=max_length)

# 构建模型
model = Sequential()
model.add(Embedding(max_features, embedding_dims, input_length=max_length))
model.add(Dropout(0.2))
model.add(Conv1D(filters, kernel_size, padding='valid', activation='relu', strides=1))
model.add(GlobalMaxPooling1D())
model.add(Dense(hidden_dims, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid'))

# 编译模型
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# 训练模型
model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(x_test, y_test))

# 评估模型
scores = model.evaluate(x_test, y_test, verbose=0)
print("Test accuracy:", scores[1])
相关推荐
蜡笔小新..9 小时前
从零开始:用PyTorch构建CIFAR-10图像分类模型达到接近1的准确率
人工智能·pytorch·机器学习·分类·cifar-10
Tech Synapse18 小时前
联邦学习图像分类实战:基于FATE与PyTorch的隐私保护机器学习系统构建指南
pytorch·机器学习·分类
漠缠1 天前
手机相册的 “智能分类” 功能
智能手机·分类·数据挖掘
zeroporn1 天前
在Mac M1/M2上使用Hugging Face Transformers进行中文文本分类(完整指南)
macos·分类·数据挖掘·nlp·transformer·预训练模型·文本分类
浊酒南街1 天前
TensorFlow中数据集的创建
人工智能·tensorflow
BioRunYiXue1 天前
一文了解氨基酸的分类、代谢和应用
人工智能·深度学习·算法·机器学习·分类·数据挖掘·代谢组学
白杆杆红伞伞2 天前
02_线性模型(回归分类模型)
分类·数据挖掘·回归
满怀10152 天前
【人工智能核心技术全景解读】从机器学习到深度学习实战
人工智能·python·深度学习·机器学习·tensorflow
李昊哲小课2 天前
tensorflow-cpu
大数据·人工智能·python·深度学习·数据分析·tensorflow
yzx9910133 天前
支持向量机与逻辑回归的区别及 SVM 在图像分类中的应用
支持向量机·分类·逻辑回归