当前位置:   article > 正文

CNN文本分类_2(tensorflow实现)_cnn用于文本的二分类的实现代码tensorflow

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等环境
    1. conda create -n tf python=3.8
    2. conda activate tf
    3. #tensorflow的安装
    4. pip install tensorflow-gpu -i https://pypi.douban.com/simple

    一. 测试tensorflow是否安装成功

  • 有三种方法

  • 方法一:

  1. import tensorflow as tf
  2. print(tf.__version__)
  3. #输出'2.0.0-alpha0'
  4. print(tf.test.is_gpu_available())
  5. #会输出True,则证明安装成功
  1. #新版本的tf把tf.test.is_gpu_available()换成如下命令
  2. import tensorflow as tf
  3. tf.config.list_physical_devices('GPU')
  • 方法二:
    1. import tensorflow as tf
    2. with tf.device('/GPU:0'):
    3. a = tf.constant(3)

    方法三:

    1. #输入python,进入python环境
    2. import tensorflow as tf
    3. #查看tensorflow版本
    4. print(tf.__version__)
    5. #输出'2.0.0-alpha0'
    6. #测试GPU能否调用,先查看显卡使用情况
    7. import os
    8. os.system("nvidia-smi")
    9. #调用显卡
    10. @tf.function
    11. def f():
    12. pass
    13. f()
    14. #这时会打印好多日志
    15. #再次查询显卡
    16. os.system("nvidia-smi")
    17. 可以对比两次使用情况

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

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

  1. import numpy as np
  2. import tensorflow as tf
  3. from tensorflow.keras.preprocessing import sequence
  4. from tensorflow.keras.models import Sequential
  5. from tensorflow.keras.layers import Dense, Dropout, Embedding, Conv1D, GlobalMaxPooling1D

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

2.设置随机种子:

np.random.seed(42)

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

3.定义模型超参数:

  1. max_features = 5000 # 词汇表大小
  2. max_length = 100 # 文本最大长度
  3. embedding_dims = 50 # 词嵌入维度
  4. filters = 250 # 卷积核数量
  5. kernel_size = 3 # 卷积核大小
  6. hidden_dims = 250 # 全连接层神经元数量
  7. batch_size = 32 # 批处理大小
  8. 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.对文本进行填充和截断:

  1. x_train = sequence.pad_sequences(x_train, maxlen=max_length)
  2. x_test = sequence.pad_sequences(x_test, maxlen=max_length)

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

6.构建模型:

  1. model = Sequential()
  2. model.add(Embedding(max_features, embedding_dims, input_length=max_length))
  3. model.add(Dropout(0.2))
  4. model.add(Conv1D(filters, kernel_size, padding='valid', activation='relu', strides=1))
  5. model.add(GlobalMaxPooling1D())
  6. model.add(Dense(hidden_dims, activation='relu'))
  7. model.add(Dropout(0.2))
  8. 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.评估模型:

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

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

完整代码

  1. import numpy as np
  2. import tensorflow as tf
  3. from tensorflow.keras.preprocessing import sequence
  4. from tensorflow.keras.models import Sequential
  5. from tensorflow.keras.layers import Dense, Dropout, Embedding, Conv1D, GlobalMaxPooling1D
  6. # 设置随机种子
  7. np.random.seed(42)
  8. # 定义模型超参数
  9. max_features = 5000 # 词汇表大小
  10. max_length = 100 # 文本最大长度
  11. embedding_dims = 50 # 词嵌入维度
  12. filters = 250 # 卷积核数量
  13. kernel_size = 3 # 卷积核大小
  14. hidden_dims = 250 # 全连接层神经元数量
  15. batch_size = 32 # 批处理大小
  16. epochs = 5 # 训练迭代次数
  17. # 加载数据集
  18. (x_train, y_train), (x_test, y_test) = tf.keras.datasets.imdb.load_data(num_words=max_features)
  19. # 对文本进行填充和截断,使其具有相同的长度
  20. x_train = sequence.pad_sequences(x_train, maxlen=max_length)
  21. x_test = sequence.pad_sequences(x_test, maxlen=max_length)
  22. # 构建模型
  23. model = Sequential()
  24. model.add(Embedding(max_features, embedding_dims, input_length=max_length))
  25. model.add(Dropout(0.2))
  26. model.add(Conv1D(filters, kernel_size, padding='valid', activation='relu', strides=1))
  27. model.add(GlobalMaxPooling1D())
  28. model.add(Dense(hidden_dims, activation='relu'))
  29. model.add(Dropout(0.2))
  30. model.add(Dense(1, activation='sigmoid'))
  31. # 编译模型
  32. model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
  33. # 训练模型
  34. model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(x_test, y_test))
  35. # 评估模型
  36. scores = model.evaluate(x_test, y_test, verbose=0)
  37. print("Test accuracy:", scores[1])

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/384907
推荐阅读
相关标签
  

闽ICP备14008679号