热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Tensorflow的基础使用与文本分类应用

知乎大数据比赛官网:下面是基于知乎大数据比赛的文本分类公开课:大家好,非常高兴大家今晚能参加Tensorflow的公开课,我是本次公开课的主讲人覃秉丰。今晚的公开课会分成两个部分,

知乎大数据比赛官网:

下面是基于知乎大数据比赛的文本分类公开课:

大家好,非常高兴大家今晚能参加 Tensorflow 的公开课,我是本次公开课的主讲人覃秉丰。今晚的公开课会分成两个部分, 第一部分 会介绍 Tensorflow 的基础使用,以及文本分类的思路。 第二部分会 给出具体代码来给大家讲解如何用 Tensorflow 来做文本分类。

Tensorflow 是 google 第二代人工智能学习系统。支持 python 和c++语言, 支持 CNN、 RNN 和 LSTM 等算法, 可以被用于语音识 别或图像处理等多项深度学习领域。它可以在一个或多个 CPU 或GPU 中运行。它可以运行在嵌入式系统(如手机, 平板电脑)中, PC中以及分布式系统中。它是目前全世界最火爆的深度学习平台(没有之一)。

深度学习这个行业刚刚兴起, 急需一个好的平台来提高我们的工作 效率。 google 在 2015 年 12 月 11 日开源了 Tensorflow, google希望把Tensorflow 做成行业标准。我个人也是比较看好 Tensorflow,毕竟 Google 的技术水平和公司实力都是全世界数一数二的。我们学 习了 Tensorflow 之后, 就可以使用 Tensorflow 非常方便地搭建一 些我们自己的深度网络, 实现我们想要的一些功能。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

大家先看一下这一页 PPT,了解一下 Tensorflow 的一些基本概念。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

就如同上一张 PPT 所说的,我们需要定义一个会话(Session),会话 中可以有一个或多个图(Graph),Tensorflow 会有一个默认的图,一 般情况下使用默认的图就足够了。在图中可以定义计算的节点,称为OP,一个 OP 可以获得张量(Tensor)或者变量(Variable),然后进 行计算。计算后得到的结构可以传给下一个 OP 再进行计算。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

下面我们来看看 Tensorflow 中一个最基本的应用-MNIST 数据集分 类。手写数字图片数据集分成两个部分,训练集有 60000 张图片,测 试集有 10000 张图片。图片都是 0-9 的手写数字,类似于上面几张图 片的样子。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

这里的重点是每一张图片都是 28*28 的黑白图片,然后把二维的图片变成一维的向量,向量的长度是 28*28=784。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

训练集一共有 60000 张图片,所以数据的格式就像这样,是一个形状 为 [60000, 784] 的张量。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

训练集的标签是[60000,10]的张量。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

我们可以构建一个如图所示的神经网络,输入层有 784 个神经元,对 应一张图片有 784 个像素。输出层有 10 个神经元,对应 0 到 9 一共10 个数字。下面我们来看看程序。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

大家花 3 分钟看看 MNIST 的代码,代码里面写了详细的注释应该还 是比较好理解的。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

接下来我们会讲解如何使用 CNN 来做文本分类。内容会涉及到一些CNN 的知识,和 word2vec 的知识,由于时间的问题我们就不具体介 绍了。不太了解的朋友可以到网上查一下相关的知识。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

这幅图很好的描绘了 CNN 网络在自然语言处理中的使用。大家先花2 分钟自己看一下,等下我再给大家讲解。

下面我给大家讲解一下这幅图,我给这些层做了从左到右做了一个编 号,分别为 1,2,3,4,5 层。我们先看第 1 层,第 1 层是输入层,输入一 句话,或者一段文本。比如图中一共有 7 个词,每个词用一个向量来 表示(这个的向量可以使用 word2vec),图中 d=5 意思是维度为 5 的 向量,不过实际使用中一般我们会用 128 维,200 维,256 维,或 300维等比较大的维度。这样我们就可以得到一个矩阵,每个词占矩阵中 的一行,列就是词向量。

我们再看到第 2 层,第 2 层定义了三个尺寸的滤波器。滤波的列数跟 第 1 层矩阵中的列数要是一样的(图中是 5 列,假如我们使用 128 维 的词向量,那么第 2 层的滤波器就是 128 列),滤波器的行数有三个 尺寸,分别是 2,3,4,每种尺寸的滤波器有 2 个。

使用第 2 层中的滤波对第 1 层的矩阵求卷积,就可以得到第 3 层。使 用尺寸为 4 的滤波器求卷积会得到 4 个输出值,使用尺寸为 3 的滤波 器求卷积会得到 5 个输出值,使用尺寸为 2 的滤波器求卷积会得到 6个输出值。

第 3 层到第 4 层有一个最大池化的操作,其实就是取第 3 层中每个滤 波器输出的 feature map 的最大值。因为一共有 6 个滤波器,所以会 得到 6 个 feature map,所以第 4 层会得到 6 个值。

第 5 层是分类层,假如我们需要分 2 个类,第 5 层就只有 2 个神经 元。如果我们需要分更多的类,那我们就需要设置更多的神经元。第4 层跟第 5 层之间是全连接的。

我们接着往下讲,讲解程序之前,我们先来讲一下数据预处理,以及 程序设计的思路。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

知乎的这次比赛提供的数据种类很多,数据量也很大,所以参赛选手 可以有很大地自由发挥空间。不过我这次分享主要是给大家提供一种 可行的思路和方法,并不是说大家看完我的程序之后就能拿奖。为了 节约时间,我只使用了非常少量的数据进行训练。后面我也会讲到怎 么在我的这个方法上去做提升。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

数据预处理的程序比较简单,我会把程序提供给大家,这里就不做讲 解了。我们看一下思路就可以。数据预处理使用了三个文件question_train_set.txt,question_topic_train_set.txt,topic_info.txt。这 三个文件的描述在上面可以看到。我的数据处理按照以下原则:

1.title通常来说包含的信息最重要。对于question_train_set.txt文件,为了简单起见,我们只取第三列,title 的词语编号序列。

2.对于 topic_info.txt,为了简单起见,我们不考虑 2,3,4,5,6 列。只是 简单的提取话题 id,然后转为 0-1998 的数字(一共有 1999 个话 题)

3.然后合并以上一些数据,得到最后处理后的数据。

我们可以看到,处理过后的数据,第 1 列的内容是问题的 title 中的词 编号,第 2 列是问题所属的话题 id。其实本质上就是一段文字描述,然后有一个或多个分类。训练集一共有 2999967 个问题,为了简单方 便,我把训练集拆分成了 10 份,前 9 份 300000 个数据,最后一份299967 个数据。我只取其中一份,也就是 300000 个数据来进行训练。

下面我们开始讲解程序。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

在程序的最开始先定义一些参数。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

接下来读取训练数据,并把训练数据存入 x_text 中,把分类的标签进 行一些处理,存入 y 中,图中我们可以看到 x_text 和 y 的数据格式。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

建立一个词典,并且把数据集中的词汇(如‘w305’,‘w11’,‘w1034’等),变成编号的形式。然后把数据集切分为训练集和验证集。图中 我们可以看到,数据集一共有 300000 行。在所有的数据集中,词汇 数最多的一段数据一共有 72 个词汇,所有 x_shape 的列为 72,同时我们要把所有的数据的词汇数都变成 72,如果不够 72 个词汇就填充0,一直填充到 72 个元素。y_shape 的列为 1999,因为一共有 1999个话题的分类。x 和 y 的数据格式如上图所示。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

接下来定义占位符,tf.placeholder 创建了一个占位符变量,当我们训 练或测试的时候,都可以使用它向我们的模型输入数据。同时还设置 了一些参数。

上面还定义了第一个网络层,这一层的作用是将词汇索引映射到词向 量进行表示。它的本质是一个我们从数据中学习得到的词汇向量表。

W 是我们的嵌入矩阵,这个矩阵是我们从数据训练过程中得到的。最 开始,我们使用一个随机均匀分布来进行初始化。tf.nn.embedding_lookup 创建实际的嵌入读取操作,这个嵌入操作返 回的数据维度是三维张量 [None, sequence_length, embedding_size] 。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

TensorFlow 的卷积操作conv2d需要一个四维的输入数据,对应的维 度分别是批处理大小,宽度,高度和通道数。在我们嵌入层得到的数 据中不包含通道数,所以我们需要手动添加它,所以最终的数据维度 是 [None, sequence_length, embedding_size, 1] 。

这一部分是构建卷积层和池化层。因为我们使用的卷积核是不同尺寸 的,所以我们需要为每一个卷积核创建一层网络,最后再把这些经过 卷积和池化之后的数据合成一个大的特征向量。整个过程就跟右边的 图差不多。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

接下来定义 dropout 层,输出层。并且定义 loss 函数和优化器。这里我们可以看到 num_filters_total 等于 3072,说明倒数第 2 层有 3072 个 神经元,话题一共有 1999 个分类,所以倒数第 2 层跟最后的输出层 是 3072×1999 的全连接网络。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

这里定义了一个批次数据的生成程序,使用生成器生成num_epochs×num_batches_per_epoch 个批次的数据用于训练。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

这里定义了知乎提供的评测方案。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

最后就是调用之前的函数,生成批次数据,在会话中训练模型。每训 练 50 次测试 1 次模型效果,每训练 200 次保存一次模型。

模型训练好之后,我们再调用训练好的模型去预测question_eval_set.txt 就可以了。预测的程序我也会提供给大家,这里 就不做详细介绍了。

我按照前面说的方法简单预处理过后,取十分之一的数据进行训练,训练了 2-3 个周期。最后在知乎比赛官网提交结果得到了 0.3 左右的 分数。结果不算很好也不算很差,排名在中等的位置吧。

最后我再给大家提供几个优化的思路,以供参考。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

1.把所有的数据训练完。因为我只用了十分之一的数据,如果你使用 了所有的数据来训练,最后的预测准确率应该会有较大提升。

2.增加训练周期,使用动态学习率。因为我只训练了 2 个周期,还是 比较少的,模型应该还有优化空间。同时我使用的是固定的学习率,如果改成动态的学习率,也就是开始的时候学习率比较大,随着训 练的进行,学习率越来越小,比较有助于网络进一步优化。

3.使用知乎提供的 word_embedding.txt 文件来初始化词汇向量表。 我的程序中词汇向量表示随机初始化的,如果使用知乎提供的文 件来初始化词汇向量表,那么可以使用模型的收敛速度更快,并且 模型最后应该可以获得更高的准确率。

4.考虑使用更多种类的数据。在我的程序中我只使用的问题 title 的 词汇数据,如果合理使用问题 title 的字符数据,问题描述的字符数 据、词汇数据,合理使用 topic_info.txt 中话题之间的联系,话题的 描述。应该可以取得更好的效果。

5.调节网络参数。我基本上没有怎么优化网络参数。如果对卷积核大 小,每一种卷积核个数,dropout 参数,l2 正则化系数,批次大小,优化器选择,学习率选择等等参数进行一些调试应该可以使得模 型效果有所提升。

6.优化网络结构。我使用的用于文本分类的 CNN 的网络结构几乎是 最简单的网络结构,所以如果对网络结构进行优化,选择更深层的,结构更复杂的卷积神经网络,那么结果应该会有很大提升。

优化方案当然不止这些,大家也可以自己考虑一些其他优化方案。

最后大家可以加一下我的公众号:深度学习与神经网络

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

今天分享的内容都放到了我的 github 上,代码在我的 github 上可以 下载,之后我也会放更多深度学习的分享内容到 github 上面。

github链接


推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • 读手语图像识别论文笔记2
    文章目录一、前言二、笔记1.名词解释2.流程分析上一篇快速门:读手语图像识别论文笔记1(手语识别背景和方法)一、前言一句:“做完了&#x ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • OCR:用字符识别方法将形状翻译成计算机文字的过程Matlab:商业数学软件;CUDA:CUDA™是一种由NVIDIA推 ... [详细]
author-avatar
手机用户2502871803
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有