好用的cnn网络_DPCNN,究竟是多么牛逼的网络呢?

ACL2017年中,腾讯AI-lab提出了DeepPyramidConvolutionalNeuralNetworksforTextCategorization(DPCNN)。论文中提出了一种基于word-level级别的网络-DPCNN,由于上一篇文章介绍的TextCNN不能通过卷积获得文本的长距离依赖关系,而论文中DPCNN通过不断加深网络,可以抽取长距离的文本依赖关系。实验证明在不增加太多计算成本的情况下,增加网络深度就可以获得最佳的准确率。‍

DPCNN结构

究竟是多么牛逼的网络呢?我们下面来窥探一下模型的芳容。

DPCNN结构细节

模型是如何通过加深网络来捕捉文本的长距离依赖关系的呢?下面我们来一一道来。为了更加简单的解释DPCNN,这里我先不解释是什么是Regionembedding,我们先把它当作wordembedding。

等长卷积

首先交代一下卷积的的一个基本概念。一般常用的卷积有以下三类:

假设输入的序列长度为n,卷积核大小为m,步长(stride)为s,输入序列两端各填补p个零(zeropadding),那么该卷积层的输出序列为(n-m+2p)/s+1。

(1)窄卷积(narrowconvolution):步长s=1,两端不补零,即p=0,卷积后输出长度为n-m+1。

(2)宽卷积(wideonvolution):步长s=1,两端补零p=m-1,卷积后输出长度n+m-1。

(3)等长卷积(equal-widthconvolution):步长s=1,两端补零p=(m-1)/2,卷积后输出长度为n。如下图所示,左右两端同时补零p=1,s=3。

池化

那么DPCNN是如何捕捉长距离依赖的呢?这里我直接引用文章的小标题——Downsamplingwiththenumberoffeaturemapsfixed。

作者选择了适当的两层等长卷积来提高词位embedding的表示的丰富性。然后接下来就开始Downsampling(池化)。再每一个卷积块(两层的等长卷积)后,使用一个size=3和stride=2进行maxpooling进行池化。序列的长度就被压缩成了原来的一半。其能够感知到的文本片段就比之前长了一倍。

例如之前是只能感知3个词位长度的信息,经过1/2池化层后就能感知6个词位长度的信息啦,这时把1/2池化层和size=3的卷积层组合起来如图所示。

固定featuremaps(filters)的数量

为什么要固定featuremaps的数量呢?许多模型每当执行池化操作时,增加featuremaps的数量,导致总计算复杂度是深度的函数。与此相反,作者对featuremap的数量进行了修正,他们实验发现增加featuremap的数量只会大大增加计算时间,而没有提高精度。

另外,夕小瑶小姐姐在知乎也详细的解释了为什么要固定featuremaps的数量。有兴趣的可以去知乎搜一搜,讲的非常透彻。

固定了featuremap的数量,每当使用一个size=3和stride=2进行maxpooling进行池化时,每个卷积层的计算时间减半(数据大小减半),从而形成一个金字塔。

这就是论文题目所谓的Pyramid。

好啦,看似问题都解决了,目标成功达成。剩下的我们就只需要重复的进行等长卷积+等长卷积+使用一个size=3和stride=2进行maxpooling进行池化就可以啦,DPCNN就可以捕捉文本的长距离依赖啦!

Shortcutconnectionswithpre-activation

但是!如果问题真的这么简单的话,深度学习就一下子少了超级多的难点了。

(1)初始化CNN的时,往往各层权重都初始化为很小的值,这导致了最开始的网络中,后续几乎每层的输入都是接近0,这时的网络输出没有意义;

(2)小权重阻碍了梯度的传播,使得网络的初始训练阶段往往要迭代好久才能启动;

(3)就算网络启动完成,由于深度网络中仿射矩阵(每两层间的连接边)近似连乘,训练过程中网络也非常容易发生梯度爆炸或弥散问题。

当然,上述这几点问题本质就是梯度弥散问题。那么如何解决深度CNN网络的梯度弥散问题呢?当然是膜一下何恺明大神,然后把ResNet的精华拿来用啦!ResNet中提出的shortcut-connection/skip-connection/residual-connection(残差连接)就是一种非常简单、合理、有效的解决方案。

类似地,为了使深度网络的训练成为可能,作者为了恒等映射,所以使用加法进行shortcutconnections,即z+f(z),其中f用的是两层的等长卷积。这样就可以极大的缓解了梯度消失问题。

另外,作者也使用了pre-activation,这个最初在何凯明的“IdentityMappingsinDeepResidualNetworks上提及,有兴趣的大家可以看看这个的原理。直观上,这种“线性”简化了深度网络的训练,类似于LSTM中constanterrorcarousels的作用。而且实验证明pre-activation优于post-activation。

整体来说,巧妙的结构设计,使得这个模型不需要为了维度匹配问题而担忧。

Regionembedding

同时DPCNN的底层貌似保持了跟TextCNN一样的结构,这里作者将TextCNN的包含多尺寸卷积滤波器的卷积层的卷积结果称之为Regionembedding,意思就是对一个文本区域/片段(比如3gram)进行一组卷积操作后生成的embedding。

另外,作者为了进一步提高性能,还使用了tv-embedding(two-viewsembedding)进一步提高DPCNN的accuracy。

上述介绍了DPCNN的整体架构,可见DPCNN的架构之精美。本文是在原始论文以及知乎上的一篇文章的基础上进行整理。本文可能也会有很多错误,如果有错误,欢迎大家指出来!建议大家为了更好的理解DPCNN,看一下原始论文和参考里面的知乎。

用Keras实现DPCNN网络

这里参考了一下kaggle的代码,模型一共用了七层,模型的参数与论文不太相同。这里滤波器通道个数为64(论文中为256),具体的参数可以参考下面的代码,部分我写了注释。

defCNN(x):block=Conv1D(filter_nr,kernel_size=filter_size,padding=same,activation=linear,kernel_regularizer=conv_kern_reg,bias_regularizer=conv_bias_reg)(x)block=BatchNormalization()(block)block=PReLU()(block)block=Conv1D(filter_nr,kernel_size=filter_size,padding=same,activation=linear,kernel_regularizer=conv_kern_reg,bias_regularizer=conv_bias_reg)(block)block=BatchNormalization()(block)block=PReLU()(block)returnblockdefDPCNN():filter_nr=64#滤波器通道个数filter_size=3#卷积核max_pool_size=3#池化层的pooling_sizemax_pool_strides=2#池化层的步长dense_nr=256#全连接层spatial_dropout=0.2dense_dropout=0.5train_embed=Falseconv_kern_reg=regularizers.l2(0.00001)conv_bias_reg=regularizers.l2(0.00001)comment=Input(shape=(maxlen,))emb_comment=Embedding(max_features,embed_size,weights=[embedding_matrix],trainable=train_embed)(comment)emb_comment=SpatialDropout1D(spatial_dropout)(emb_comment)#regionembedding层resize_emb=Conv1D(filter_nr,kernel_size=1,padding=same,activation=linear,kernel_regularizer=conv_kern_reg,bias_regularizer=conv_bias_reg)(emb_comment)resize_emb=PReLU()(resize_emb)#第一层block1=CNN(emb_comment)block1_output=add([block1,resize_emb])block1_output=MaxPooling1D(pool_size=max_pool_size,strides=max_pool_strides)(block1_output)#第二层block2=CNN(block1_output)block2_output=add([block2,block1_output])block2_output=MaxPooling1D(pool_size=max_pool_size,strides=max_pool_strides)(block2_output)#第三层block3=CNN(block2_output)block3_output=add([block3,block2_output])block3_output=MaxPooling1D(pool_size=max_pool_size,strides=max_pool_strides)(block3_output)#第四层block4=CNN(block3_output)block4_output=add([block4,block3_output])block4_output=MaxPooling1D(pool_size=max_pool_size,strides=max_pool_strides)(block4_output)#第五层block5=CNN(block4_output)block5_output=add([block5,block4_output])block5_output=MaxPooling1D(pool_size=max_pool_size,strides=max_pool_strides)(block5_output)#第六层block6=CNN(block5_output)block6_output=add([block6,block5_output])block6_output=MaxPooling1D(pool_size=max_pool_size,strides=max_pool_strides)(block6_output)#第七层block7=CNN(block6_output)block7_output=add([block7,block6_output])output=GlobalMaxPooling1D()(block7_output)#全连接层output=Dense(dense_nr,activation=linear)(output)output=BatchNormalization()(output)output=PReLU()(output)output=Dropout(dense_dropout)(output)output=Dense(6,activation=sigmoid)(output)model=Model(comment,output)model.summary()model.compile(loss=binary_crossentropy,optimizer=optimizers.Adam(),metrics=[accuracy])returnmodel

DPCNN实战

上面我们用keras实现了我们的DPCNN网络,这里我们借助kaggle的有毒评论文本分类竞赛来实战下我们的DPCNN网络。

具体地代码,大家可以去我的GitHub上面找到源码:

https://github.com/hecongqing/TextClassification/blob/master/DPCNN.ipynb

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

干货-iOS、mac开源项目及库,以后我也会持续更新。

昨晚在网上看的干货,直接分享给大家了,觉得有用的,直接fork吧。 https://github.com/Brances/TimLiu-iOS转载于:https://www.cnblogs.com/brance/p/5366843.html

二叉树前序中序后续线索树_二叉树的先序,中序,后序遍历以及线索二叉树的遍历...

二叉树的先序,中序,后序遍历以及线索二叉树的遍历(2008-05-04 17:52:49)标签:杂谈C二叉树的先序,中序,后序遍历以及线索二叉树的遍历头文件//*******************************************************************************//二叉树中的数据类型为ElemType//***…

EasyDarwin开源手机直播方案:EasyPusher手机直播推送,EasyDarwin流媒体服务器,EasyPlayer手机播放器...

在不断进行EasyDarwin开源流媒体服务器的功能和性能完善的同时,我们也配套实现了目前在安防和移动互联网行业比较火热的移动端手机直播方案,主要就是我们的 EasyPusher直播推送项目 和 EasyPlayer播放器项目; 先大概对EasyPusher和EasyPlayer…

以下不属于时序逻辑电路的有_电工电子技术(不建议浪费时间学习的科目)

(声明:本资料来自网络,侵权请告知删除。文末有全套高清版资料下载链接,敬请下载学习)2019年7月在天津召开的土力学及岩土工程年会上,有一场青年教师的土力学讲课竞赛,由我作一些点评,其中关于土颗粒与土骨架…

VS2010 + QT 5 +open inventor 环境配置

本科毕业设计做的是 随钻测量的井眼轨迹和测井曲线的三维显示 要求的环境是 QT Open Inventor 在寒假开学前,打算将环境配置好,开学后再正式编码实现,可是。。。。环境也没弄好 在简单的了解了QT和open inventor后,决定用vs…

12伏的蓄电池有几个单格组成_蓄电池的结构和识别

蓄电池是储备电能的一种直流装置。蓄电池充电时将电能转变为化学能,使用时内部化学能转变为电能向外输送给用电设备。蓄电池充放电过程是一种完全可逆的化学反应,因为蓄电池的充电和放电过程,可以重复循环多次,所以又称为二次电池…

第四周JAVA作业

本次作业实现实现了大文件快速拷贝 package copy; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class CopyFile { /** * param args */ public static void main(String[] args) { long startTime System.currentT…

2-jQuery - AJAX load() 方法【进阶篇】

第一篇的AJAX load() 方法过于简单&#xff0c;补充一下&#xff0c;完整的。 格式 $(selector).load(URL,data,callback); 源码 <!DOCTYPE html> <html><head><meta charset"utf-8" /><script type"text/javascript" src"…

前端js获取图片大小 扩展名_前端 JS 获取 Image 图像 宽高 尺寸

前端 JS 获取 Image 图像 宽高 尺寸简介项目中用到获取图片的原始尺寸&#xff0c;然后适配宽高&#xff1b;网上的大部分前端解决方案&#xff0c;都是new Image()后,在onload事件中获取image的尺寸。在图片数量较多的时候&#xff0c;这样的获取效率实在是低下。所有就有了这…

InnoDB还是MyISAM?

两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用。 我作为使用MySQL的用户角度出发&#xff0c;Innodb和MyISAM都是比较喜欢的&#xff0c;但是从我目前运维的数据库平台要达到需求&#xff1a;9…

mysql linux 安装_mysql-5.7.28 在Linux下的安装教程图解

2.上传tar包到服务器到 /usr/local/src3.卸载系统自动的Mariadb rpm -qa | grep mariadb rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_644.检查是否有mysql存在rpm -qa|grep -i mysql5.查询是否还有mysql的目录find / -name mysql6.解压&#xff1a;tar -zxvf7.修改名称&…

有关软件工程的问题的分析和讨论及课后的作业3

个人电脑界面的演变。 1973年四月第一次操作是在施乐PARC Alto计算机完成。 该系统是第一个将现代图形用户界面中的所有元素结合起来的系统。 1981年6月施乐介绍了星&#xff0c;商业阿尔托的继任者。 显著特点&#xff1a;双点击图标&#xff0c;重叠窗口&#xff0c;对话框和…

mysql语句中模糊查询_关于sql、mysql语句的模糊查询分类与详解,包括基本用法和mapper.xml文件里插入写法...

欢迎猿类加qq:2318645572,共同学习进步实际例子&#xff1a;ssm框架:service业务层->dao层->mappers.xml->junit/test测试1:service业务层(package)Resourceprivate BooksDao bookDao;public List> Service(String serachtitle, String serachtype) {Map paramnew …

GOF设计模式之1:单例设计模式

1.单例设计模式核心作用&#xff1a; 保证一个类只有一个实例&#xff0c;并且提供了访问该实例的全局访问点 2.常见应用场景&#xff1a; window的任务管理器项目中读取配置文件一般也是一个单例模式数据库连接池的设计也是采用单例模式&#xff0c;因为数据库连接是一种数据库…

php 管理 mysql 数据库 代码_PHP5对Mysql5的任意数据库表的管理代码示例(三)

续&#xff1a;点击编辑一个条目会跳转至edit.php//edit.phpEditing an entry from the databaseEdit an entry$database "sunsite";$tablename $_REQUEST[tablename];echo "Data from $tablename";MySQL_connect("localhost","root"…

封装EF code first用存储过程的分页方法

一年半没有做过MVC的项目了&#xff0c;还是很怀念&#xff08;因为现在项目还是原来的ASPX&#xff09;&#xff0c;个人还是喜欢mvc&#xff0c;最近又开始重拾MVC&#xff0c;感觉既熟悉又陌生。 记录一下封装好的分页代码 首先先说下 我使用EF codefirst的目的. 是因为可以…

apache httpd mysql_Centos7安装配置Apache(httpd)+php+mysql+phpMyAdmin

一、安装mysql执行命令&#xff1a;rpm -ivh mysql-community-release-el7-5.noarch.rpm执行 yum -y install mysql mysql-server mysql-devel&#xff0c;安装成功。再次使用该命令&#xff0c;然后得到以下信息打开mysql服务 &#xff1a;service mysqld start进入mysql客户端…

如何:创建公钥/私钥对

要使用强名称为程序集签名&#xff0c;必须具有公钥/私钥对。 这一对加密公钥和加密私钥用于在编译过程中创建强名称程序集。 您可以使用强名称工具 (Sn.exe) 来创建密钥对。 密钥对文件通常具有 .snk 扩展名。 注意 在 Visual Studio 中&#xff0c;C# 和 Visual Basic 项…

用户设置及用户默认设置

1、创建 其中&#xff0c;Root.plist中为设置 2、读取应用中的设置 3、在应用中修改默认设置 4、注册默认值 5、保证设置有效&#xff08;我们注册所有控制器&#xff0c;以便接收从暂停执行状态唤醒的应用发送出来的通知&#xff09; 每个控制器都订阅我们关注的通知。 6、撤销…

activemq jdbc mysql_activeMQ JDBC Master Slave

ActiveMQ集群应用2\ ActiveMQ JDBC 主从集群3\ 解决单点故障&#xff1a;JDBC Master Slave本人应用的为集群方案中的一种&#xff0c; JDBC Master Slave &#xff0c;说明及好处就看如上外链文章了&#xff0c;上正题&#xff0c;方案如何实施及程序如何调用&#xff11;&…