Implementing a CNN for Text Classification in TensorFlow(用tensorflow实现CNN文本分类) 阅读笔记

本文主要是介绍Implementing a CNN for Text Classification in TensorFlow(用tensorflow实现CNN文本分类) 阅读笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    目前正在学习把深度学习应用到NLP,主要是看些论文和博客,同时做些笔记方便理解,还没入门很多东西还不懂,一知半解。贴出来的原因,一是方便自己查看,二是希望大家指点一下,尽快入门。

    原paper:Convolutional Neural Networks for Sentence Classification

    源代码:https://github.com/dennybritz/cnn-text-classification-tf

    原博客:http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/


    1. 数据和预处理

      1. 数据集:电影评论数据——Movie Review data from Rotten Tomatoes,包含5331个积极的评论和5331个消极评论,同时包含一个20k的词表

      2. 注意:数据集过小容易过拟合,可以进行10交叉验证

      3. 步骤:

        1. 加载两类数据

        2. 文本数据清洗

        3. 把每个句子填充到最大的句子长度,填充字符是<PAD>,使得每个句子都包含59个单词。相同的长度有利于进行高效的批处理

        4. 根据所有单词的词表,建立一个索引,用一个整数代表一个词,则每个句子由一个整数向量表示

    2. 模型

      1. 第一层把词嵌入到低纬向量;第二层用多个不同大小的filter进行卷积;第三层用max-pool把第二层多个filter的结果转换成一个长的特征向量并加入dropout正规化;第四层用softmax进行分类。

      2. 简化模型,方便理解:

        1. 不适用预训练的word2vec的词向量,而是学习如何嵌入

        2. 不对权重向量强制执行L2正规化

        3. 原paper使用静态词向量和非静态词向量两个同道作为输入,这里只使用一种同道作为输入

    3. 实现

      1. TextCNN类,参数如下:

        1. sequence_length:句子长度,把每个句子统一填充到59个单词

        2. num_classes:输出的类型个数,这里是积极和消极两类

        3. vocab_size:词典长度,需要在嵌入层定义

        4. embeding_size :嵌入的维度

        5. filter_sizes:卷积核的高度

        6. num_filters:每种不同大小的卷积核的个数,这里每种有3个

      2. 输入占位符(定义我们要传给网络的数据)

        1. 如输入占位符,输出占位符和dropout占位符

        2. tf.placeholder创建一个占位符,在训练和测试时才会传入相应的数据。第一个参数是数据类型;第二个参数是tensor的格式,none表示是任何大小;第三个参数是名称

        3. dropout_keep_prob是保留一个神经元的概率,这个概率只在训练的时候用到

      3. 第一层(嵌入层)

        1. tf.device("/cpu:0")使用cpu进行操作,因为tensorflow当gpu可用时默认使用gpu,但是embedding不支持gpu实现,所以使用CPU操作

        2. tf.name_scope,把所有操作加到命名为embedding的顶层节点,用于可视化网络视图

        3. W是我们在训练时得到的嵌入矩阵,通过随机均匀分布进行初始化

        4. tf.nn.embedding_lookup 是真正的embedding操作,结果是一个三维的tensor,[None, sequence_length, embedding_size]

        5. 因为卷积操作conv2d需要4个维度的tensor所以需要给embedding结果增加一个维度,得到[None, sequence_length, embedding_size, 1]

      4. 卷积和max-pooling

        1. 对不同大小的filter建立不同的卷积层,W是卷积的输入矩阵,h是使用relu进行卷积的结果。

        2. “VALID”表示使用narrow卷积,得到的结果大小为[1, sequence_length - filter_size + 1, 1, 1]

        3. 为了更容易理解,需要计算输入输出的大小:"VALID" padding means that we slide the filter over our sentence without padding the edges, performing a narrow convolution that gives us an output of shape[1, sequence_length - filter_size + 1, 1, 1]. Performing max-pooling over the output of a specific filter size leaves us with a tensor of shape[batch_size, 1, 1, num_filters]. This is essentially a feature vector, where the last dimension corresponds to our features. Once we have all the pooled output tensors from each filter size we combine them into one long feature vector of shape[batch_size, num_filters_total]. Using-1 intf.reshape tells TensorFlow to flatten the dimension when possible.

      5. Dropout层

        1. dropout是正规化卷积神经网络最流行的方法,即随机禁用一些神经元

      6. 分数和预测

        1. 用max-pooling得到的向量作为x作为输入,与随机产生的W权重矩阵进行计算得到分数,选择分数高的作为预测类型结果

      7. 交叉熵损失和正确率

      8. 网络可视化

      9. 训练过程

        1. Session是执行graph操作(表示计算任务)的上下文环境,包含变量和序列的状态。每个session执行一个graph。tensorflow包含了默认session,也可以自定义session然后通过session.as_default() 设置为默认视图

        2. graph包含操作和tensors(表示数据),可以在程序中建立多个图,但是通常只需一个图。同一个图可以在多个session中使用,但是不能多个图在一个session中使用。

        3. allow_soft_placement可以在不存在预设运行设备时可以在其他设备运行,例如设置在gpu上运行的操作,当没有gpu时allow_soft_placement使得可以在cpu操作

        4. log_device_placement用于设备的log,方便debugging

        5. FLAGS是程序的命令行输入

      10. CNN初始化和最小化loss

        1. 按照TextCNN的参数进行初始化

        2. tensorflow提供了几种自带的优化器,我们使用Adam优化器求loss的最小值

        3. train_op就是训练步骤,每次更新我们的参数,global_step用于记录训练的次数,在tensorflow中自增

      11. summaries汇总

        1. tensorflow提供了各方面的汇总信息,方便跟踪和可视化训练和预测的过程。summaries是一个序列化的对象,通过SummaryWriter写入到光盘

      12. checkpointing检查点

        1. 用于保存训练参数,方便选择最优的参数,使用tf.train.saver()进行保存

      13. 变量初始化

        1. sess.run(tf.initialize_all_variables()),用于初始化所有我们定义的变量,也可以对特定的变量手动调用初始化,如预训练好的词向量

      14. 定义单一的训练步骤

        1. 定义一个函数用于模型评价、更新批量数据和更新模型参数

        2. feed_dict中包含了我们在网络中定义的占位符的数据,必须要对所有的占位符进行赋值,否则会报错

        3. train_op不返回结果,只是更新网络的参数

      15. 训练循环

        1. 遍历数据并对每次遍历数据调用train_step函数,并定期打印模型评价和检查点

      16. 用tensorboard进行结果可视化

        1. python tensorflow/tensorboard/tensorboard.py --logdir=path/to/log-directory
        2. 问题是没找到tensorboard.py文件,找了半天发现在/home/pyx/.local/lib/python3.5/site-package/tensorflow中,但是报warming,可以忽略
      17. 本实验的几个问题
        1. 训练的指标不是平滑的,原因是我们每个批处理的数据过少
        2. 训练集正确率过高,测试集正确率过低,过拟合。避免过拟合:更多的数据;更强的正规化;更少的模型参数。例如对最后一层的权重进行L2惩罚,使得正确率提升到76%,接近原始paper


                        
















    这篇关于Implementing a CNN for Text Classification in TensorFlow(用tensorflow实现CNN文本分类) 阅读笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



    http://www.chinasem.cn/article/456214

    相关文章

    Python实现对阿里云OSS对象存储的操作详解

    《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

    关于集合与数组转换实现方法

    《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

    使用Python实现可恢复式多线程下载器

    《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

    java实现docker镜像上传到harbor仓库的方式

    《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

    C++20管道运算符的实现示例

    《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

    Java easyExcel实现导入多sheet的Excel

    《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

    python实现对数据公钥加密与私钥解密

    《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

    浏览器插件cursor实现自动注册、续杯的详细过程

    《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

    Golang如何对cron进行二次封装实现指定时间执行定时任务

    《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

    Golang如何用gorm实现分页的功能

    《Golang如何用gorm实现分页的功能》:本文主要介绍Golang如何用gorm实现分页的功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景go库下载初始化数据【1】建表【2】插入数据【3】查看数据4、代码示例【1】gorm结构体定义【2】分页结构体