• NLP之搭建RNN神经网络


    代码展示

    # 构建RNN神经网络
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense, SimpleRNN, Embedding
    import tensorflow as tf
    
    dict_size = 20000
    max_comment_length = 120
    
    rnn = Sequential()
    # 对于rnn来说首先进行词向量的操作
    rnn.add(Embedding(input_dim=dict_size, output_dim=60, input_length=max_comment_length))
    rnn.add(SimpleRNN(units=100))  # 第二层构建了100个RNN神经元
    rnn.add(Dense(units=10, activation=tf.nn.relu))
    rnn.add(Dense(units=5, activation=tf.nn.softmax))  # 输出分类的结果
    rnn.compile(loss='sparse_categorical_crossentropy', optimizer="adam", metrics=['accuracy'])
    print(rnn.summary())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    代码意图

    这段代码的目的是使用TensorFlow库来构建一个简单的循环神经网络(RNN)模型,用于处理文本数据。该模型的预期应用可能是文本分类任务,如情感分析或文本主题分类

    流程描述:

    1. 导入必要的库和模块:

      • Sequential:Keras中用于构建线性堆叠的模型。
      • Dense:全连接层。
      • SimpleRNN:简单的RNN层。
      • Embedding:嵌入层,用于将整数标识(通常是单词)转化为固定大小的向量。
    2. 初始化模型:

      • 使用Sequential()方法初始化一个新的模型。
    3. 添加嵌入层 (Embedding):

      • 将单词的整数索引映射到密集向量。这是将文本数据转化为可以被神经网络处理的形式的常见方法。
      • 输入维度 (input_dim) 是词汇表的大小。
      • 输出维度 (output_dim) 是嵌入向量的大小。
      • 输入长度 (input_length) 是输入文本的最大长度。
    4. 添加简单RNN层 (SimpleRNN):

      • 该层具有100个神经元。
      • RNN是循环神经网络,可以在序列数据上进行操作,捕捉时间或序列上的模式。
    5. 添加两个全连接层 (Dense):

      • 第一个全连接层有10个神经元,并使用ReLU激活函数。
      • 第二个全连接层有5个神经元,并使用Softmax激活函数,这可能意味着这是一个五分类的问题。
    6. 编译模型:

      • 损失函数为’sparse_categorical_crossentropy’,这是一个多分类问题的常见损失函数。
      • 使用“adam”优化器。
      • 评价标准为“准确度”。
    7. 打印模型概述:

      • 使用rnn.summary()方法打印模型的结构和参数数量。

    这样,一个简单的RNN模型就构建完成了,可以使用相应的数据进行训练和预测操作。

    代码解读

    逐行解读这段代码,并解释其中的函数和导入的模块的用法和功能。

    from tensorflow.keras.models import Sequential
    
    • 1

    tensorflow.keras.models导入Sequential类。Sequential是一个线性堆叠的层的容器,用于简单地构建模型。

    from tensorflow.keras.layers import Dense, SimpleRNN, Embedding
    
    • 1

    tensorflow.keras.layers导入三个层类:

    • Dense:全连接层。
    • SimpleRNN:简单循环神经网络层。
    • Embedding:嵌入层,用于将正整数(索引值)转换为固定大小的向量,常用于处理文本数据。
    import tensorflow as tf
    
    • 1

    导入TensorFlow库,并给它一个别名tf

    rnn = Sequential()
    
    • 1

    创建一个新的Sequential模型对象,并命名为rnn

    rnn.add(Embedding(input_dim=dict_size, output_dim=60, input_length=max_comment_length))
    
    • 1

    向模型中添加一个Embedding层,设置以下参数:

    • input_dim=dict_size:词汇表的大小。
    • output_dim=60:每个输入的整数(即每个单词)将被转换为一个60维的向量。
    • input_length=max_comment_length:输入序列的长度。
    rnn.add(SimpleRNN(units=100))
    
    • 1

    向模型中添加一个SimpleRNN层,其中有100个RNN神经元。

    rnn.add(Dense(units=10, activation=tf.nn.relu))
    
    • 1

    向模型中添加一个全连接层Dense,其中有10个神经元,并使用ReLU激活函数。

    rnn.add(Dense(units=5, activation=tf.nn.softmax))
    
    • 1

    再次向模型中添加一个全连接层Dense,此时有5个神经元,并使用softmax激活函数。这层的目的通常是进行分类,5个神经元意味着模型输出5个类别的概率分布。

    rnn.compile(loss='sparse_categorical_crossentropy', optimizer="adam", metrics=['accuracy'])
    
    • 1

    使用compile方法配置模型的学习过程。设置以下参数:

    • loss='sparse_categorical_crossentropy':损失函数,用于分类问题。
    • optimizer="adam":优化器,Adam是一种常用的优化算法。
    • metrics=['accuracy']:在训练和测试期间的模型评估标准。
    print(rnn.summary())
    
    • 1

    使用summary方法输出模型的摘要信息,包括每一层的类型、输出形状和参数数量。

    print(rnn.summary())
    Model: "sequential"
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    embedding (Embedding)        (None, 120, 60)           1200000   
    _________________________________________________________________
    simple_rnn (SimpleRNN)       (None, 100)               16100     
    _________________________________________________________________
    dense (Dense)                (None, 10)                1010      
    _________________________________________________________________
    dense_1 (Dense)              (None, 5)                 55        
    =================================================================
    Total params: 1,217,165
    Trainable params: 1,217,165
    Non-trainable params: 0
    _________________________________________________________________
    None
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    这段代码输出了一个使用 Keras 构建的顺序模型(Sequential model)的摘要。这个模型包含四层,每层的类型、输出形状和参数数量都有详细说明。下面逐层解释这些信息:

    1. Embedding Layer(嵌入层)

    • 类型: Embedding。这是一个嵌入层,用于将整数(通常表示单词索引)映射到高维空间,通常用于处理文本数据。
    • 输出形状: (None, 120, 60)。这意味着每个输入样本被转换为一个 120x60 的矩阵。其中 120 可能是输入序列的长度(如单词数量),而 60 是嵌入维度。
    • 参数数量: 1,200,000。这是由词汇表大小和嵌入维度决定的。例如,如果词汇表大小为 20,000 个单词,每个单词映射到 60 维空间,则参数数量为 20,000 * 60 = 1,200,000。

    2. SimpleRNN Layer(简单循环神经网络层)

    • 类型: SimpleRNN。这是一个简单的循环神经网络层,用于处理序列数据。
    • 输出形状: (None, 100)。这表明每个样本的输出是一个 100 维的向量。
    • 参数数量: 16,100。这是由该层的输入维度、输出维度以及循环连接的特性决定的。

    3. Dense Layer(全连接层)

    • 类型: Dense。这是一个全连接层,常用于神经网络中的分类或回归。
    • 输出形状: (None, 10)。每个样本的输出是一个 10 维向量,可能表示 10 个类别的得分。
    • 参数数量: 1,010。这是由该层的输入维度(100)和输出维度(10)决定的,计算公式为:参数数量 = 输入维度 * 输出维>度 + 输出维度(偏置项)。

    4. Dense Layer(第二个全连接层)

    • 类型: Dense
    • 输出形状: (None, 5)。每个样本的输出是一个 5 维向量。
    • 参数数量: 55。同样由输入维度和输出维度决定,这里的输入维度为 10(上一层的输出),输出维度为 5。

    总结

    • 总参数数量: 1,217,165。这是所有层参数数量的总和。
    • 可训练参数: 1,217,165。所有参数都是可训练的。
    • 非可训练参数: 0。表示没有使用如批归一化层(BatchNormalization)等层的非训练参数。

    这个模型的架构是典型的序列处理模型,可能用于文本分类或类似的任务。它从将词转换为嵌入向量开始,然后通过 RNN 层处理序列,最后通过两个密集层进行分类或回归。

    总结:这段代码定义并构建了一个简单的RNN模型,用于处理文本数据。模型由一个嵌入层、一个SimpleRNN层和两个Dense层组成。

    知识点介绍

    Dense, SimpleRNN, Embedding的简单原理,实现逻辑和功能
    当然可以,我会为您简明扼要地解释这三个层的基本原理、实现逻辑和功能。

    1. Embedding

    基本原理

    • Embedding是一种用于处理分类数据(通常是文本数据)的技术,可以将大量分类数据(如单词)转换为稠密向量。这些向量捕捉了数据间的语义关系。

    实现逻辑

    • 假设我们有一个大小为V的词汇表,Embedding层会为每个单词分配一个D维的向量,其中D是预设的向量大小。
    • 当我们输入一个整数i到嵌入层时,它会查找对应的D维向量并返回它。

    功能

    • 将文本或其他分类数据转换为连续的、固定大小的向量,为后续的深度学习模型提供合适的输入形式。

    2. SimpleRNN

    基本原理

    • RNN(Recurrent Neural Network,循环神经网络)是一种用于处理序列数据的神经网络结构。
    • RNN有记忆功能,可以保存前一步的隐藏状态,并将其用作下一步的输入。

    实现逻辑

    • 在每一个时间步,RNN都会接收一个输入,并产生一个输出。
    • 同时,它还会将这个输出作为下一个时间步的隐藏状态。
    • SimpleRNN就是RNN的一种简单实现,它直接使用输出作为隐藏状态。

    功能

    • 由于其内部有记忆机制,RNN特别适合处理时间序列、文本、语音等序列数据。

    3. Dense

    基本原理

    • Dense层,也称为全连接层,是深度学习中最基础的一种层。
    • 每个输入节点都与每个输出节点连接。

    实现逻辑

    • 如果我们有N个输入和M个输出,那么这个Dense层将有N*M个权重和M个偏置。
    • 当输入数据传递到Dense层时,它会进行矩阵乘法和加偏置的操作,然后通常再接一个激活函数。

    功能

    • 进行非线性变换,帮助神经网络捕获和学习更复杂的模式和关系。

    总之,Embedding、SimpleRNN和Dense都是深度学习模型中常用的层。Embedding用于处理文本数据,SimpleRNN处理序列数据,而Dense层则为模型添加非线性能力和扩展性。

  • 相关阅读:
    Nios II 实现流水灯实验
    SpringBoot 如何配置 OAuth2 认证
    Mac新建文件夹报错,mkdir():Operation not supported
    易语言代码人流量统计
    Qt笔记-解决子控制大小获取不正确(width和height)需要重制窗体后,才能获得正确的值
    应用部署引起上游服务抖动问题分析及优化实践方案
    在 Java 中检查空字符串或空白字符串
    软件测试质量保证与测试
    Java 多态
    SpringBoot整合RestHighLevelClient实现查询操作
  • 原文地址:https://blog.csdn.net/weixin_46713695/article/details/134094023