导读

最近在梳理文本分类的各个神经网络算法,特地一个来总结下。下面目录中多通道卷积已经讲过了,下面是链接,没看的可以瞅瞅。我会一个一个的讲解各个算法的理论与实践。目录暂定为:

  1. 多通道卷积神经网络(multi_channel_CNN)

  2. 深度卷积神经网络(deep_CNN)

  3. 基于字符的卷积神经网络(Char_CNN)

  4. 循环与卷积神经网络并用网络(LSTM_CNN)

  5. 树状LSTM神经网络(Tree-LSTM)

  6. Transformer(目前常用于NMT)

  7. etc..

之后的以后再补充。今天我们该将第二个,深度卷积神经网络(DeepCNN)。

DeepCNN

DeepCNN即是深度卷积神经网络,就是有大于1层的卷积网络,也可以说是多层卷积网络(Multi_Layer_CNN,咳咳,我就是这么命名滴!)我们来直接上图,看看具体长得啥样子:

我大概描述下这个过程,比如sent_len=10,embed_dim=100,也就是输入的矩阵为(10*100),假设kernel num=n,用了上下padding,kernel size=(3*100),那么卷积之后输出的矩阵为(n*10),接着再将该矩阵放入下个卷积中,放之前我们先对这个矩阵做个转置,你肯定要问为什么?俺来告诉你我自己的认识,有两点:

  • 硬性要求:这个矩阵第一个维度为10是句子长度产生的,所以是变量,我们习惯将该维度的大小控制为定量,比如第一个输入的值就是(sent_len,embed_dim),embed_dim就为定量,不变。所以转置即可。

  • 理论要求:(n*10)中的n处于的维度的数据表示的是上个数据kernel对这个数据的10个数据第一次计算,第二次计算... 第10次计算,也就可以表示为通过kernel对上个数据的每个词和它的上下文进行了新的特征提取。n则表示用n个kernel对上个句子提取了n次。则最终的矩阵为(n*10),我们要转成和输入的格式一样,将第二维度依然放上一个词的表示。所以转置即可。

n 可以设置100,200等。

然后对最终的结果进行pooling,cat,然后进过线性层映射到分类上,进过softmax上进行预测输出即可。

上述仅仅说的是两层CNN的搭建,当然你可以搭建很多层啦。

实践

下面看下具体的pytotch代码如何实现

类Multi_Layer_CNN的初始化

def __init__(self, opts, vocab, label_vocab):super(Multi_Layer_CNN, self).__init__()random.seed(opts.seed)torch.manual_seed(opts.seed)torch.cuda.manual_seed(opts.seed)self.embed_dim = opts.embed_sizeself.word_num = vocab.m_sizeself.pre_embed_path = opts.pre_embed_pathself.string2id = vocab.string2idself.embed_uniform_init = opts.embed_uniform_initself.stride = opts.strideself.kernel_size = opts.kernel_sizeself.kernel_num = opts.kernel_numself.label_num = label_vocab.m_sizeself.embed_dropout = opts.embed_dropoutself.fc_dropout = opts.fc_dropoutself.embeddings = nn.Embedding(self.word_num, self.embed_dim)if opts.pre_embed_path != '':embedding = Embedding.load_predtrained_emb_zero(self.pre_embed_path, self.string2id)self.embeddings.weight.data.copy_(embedding)else:nn.init.uniform_(self.embeddings.weight.data, -self.embed_uniform_init, self.embed_uniform_init)# 2 convsself.convs1 = nn.ModuleList([nn.Conv2d(1, self.embed_dim, (K, self.embed_dim), stride=self.stride, padding=(K // 2, 0)) for K in self.kernel_size])self.convs2 = nn.ModuleList([nn.Conv2d(1, self.kernel_num, (K, self.embed_dim), stride=self.stride, padding=(K // 2, 0)) for K in self.kernel_size])in_fea = len(self.kernel_size)*self.kernel_numself.linear1 = nn.Linear(in_fea, in_fea // 2)self.linear2 = nn.Linear(in_fea // 2, self.label_num)self.embed_dropout = nn.Dropout(self.embed_dropout)self.fc_dropout = nn.Dropout(self.fc_dropout)

数据流动

def forward(self, input):out = self.embeddings(input)out = self.embed_dropout(out)  # torch.Size([64, 39, 100])l = []out = out.unsqueeze(1)  # torch.Size([64, 1, 39, 100])for conv in self.convs1:l.append(torch.transpose(F.relu(conv(out)).squeeze(3), 1, 2))  # torch.Size([64, 39, 100])out = ll = []for conv, last_out in zip(self.convs2, out):l.append(F.relu(conv(last_out.unsqueeze(1))).squeeze(3))  # torch.Size([64, 100, 39])out = ll = []for i in out:l.append(F.max_pool1d(i, kernel_size=i.size(2)).squeeze(2))  # torch.Size([64, 100])out = torch.cat(l, 1)  # torch.Size([64, 300])out = self.fc_dropout(out)out = self.linear1(out)out = self.linear2(F.relu(out))return out

数据对比

可以看出多层(深层)CNN还是在有提升的。

github地址:

https://github.com/zenRRan/Sentiment-Analysis/blob/master/models/Multi_layer_CNN.py

欢迎fork,有问题大家尽管指出!

PS:上述图片均来自于导师张梅山,唐都钰的《Deep Learning in Natural Language Processing》的情感分析篇。


更多精彩内容,请关注 深度学习自然语言处理 公众号,就是下方啦!跟随小博主,每天进步一丢丢!哈哈!

详解文本分类之DeepCNN的理论与实践相关推荐

  1. 万字长文详解文本抽取:从算法理论到实践

    导读:"达观杯"文本智能信息抽取挑战赛已吸引来自中.美.英.法.德等26个国家和地区的2400余名选手参赛,目前仍在火热进行中(点击阅读原文进入比赛页面,QQ群见上图或文末二维码) ...

  2. ​万字长文详解文本抽取:从算法理论到实践(附“达观杯”官方baseline实现解析及答疑)...

    [ 导读 ]"达观杯"文本智能信息抽取挑战赛已吸引来自中.美.英.法.德等26个国家和地区的2400余名选手参赛,目前仍在火热进行中(点击"阅读原文"进入比赛页 ...

  3. 作曲理论与计算机音乐,专业详解 ‖ 15作曲与作曲技术理论(电子音乐方向)...

    原标题:专业详解 | 15作曲与作曲技术理论(电子音乐方向) 曾经我喜欢钢琴吉他 但在传统乐器自身的局限下 却很少能找到自由的表达方法 直到,遇到了TA 提到 电子音乐 你会想到什么? 是电吉他.电钢 ...

  4. AI艺术的背后:详解文本生成图像模型【基于 Diffusion Model】

    系列文章链接: AI艺术的背后:详解文本生成图像模型[基于 VQ-VAE] AI艺术的背后:详解文本生成图像模型[基于GAN] AI艺术的背后:详解文本生成图像模型[基于Diffusion Model ...

  5. AI艺术的背后:详解文本生成图像模型【基于GAN】

    系列文章链接: AI艺术的背后:详解文本生成图像模型[基于 VQ-VAE] AI艺术的背后:详解文本生成图像模型[基于GAN] AI艺术的背后:详解文本生成图像模型[基于Diffusion Model ...

  6. AI艺术的背后:详解文本生成图像模型【基于 VQ-VAE】

    系列文章链接: AI艺术的背后:详解文本生成图像模型[基于 VQ-VAE] AI艺术的背后:详解文本生成图像模型[基于GAN] AI艺术的背后:详解文本生成图像模型[基于Diffusion Model ...

  7. 免费报名 | WPS专家教你文本分类在企业中的应用实践

    文本分类问题是企业在 NLP 领域中处理文本数据时经常会遇到的一个问题,很多时候,我们需要将文本信息进行分类,或提相关的接口以供外部进行文本上传,在针对于用户所上传的文档信息就需要进行文档内容的分类, ...

  8. python利器的使用-图文详解python开发利器之ulipad的使用实践

    Ulipad是一个国人limodou编写的专业Python编辑器,它基于wxpython开发的GUI(图形化界面).下面这篇文章主要介绍了python开发利器之ulipad的使用实践,文中介绍的非常详 ...

  9. 一致性协议raft详解(四):raft在工程实践中的优化

    一致性协议raft详解(四):raft在工程实践中的优化 前言 性能优化 client对raft集群的读写 参考链接 前言 有关一致性协议的资料网上有很多,当然错误也有很多.笔者在学习的过程中走了不少 ...

  10. 经典算法详解--CART分类决策树、回归树和模型树

    Classification And Regression Tree(CART)是一种很重要的机器学习算法,既可以用于创建分类树(Classification Tree),也可以用于创建回归树(Reg ...

最新文章

  1. 2020年,对薪资不满意的程序员要注意了...
  2. 五、JavaScript基础知识,学会操作元素的简单事件(一)
  3. 综述 | 知识图谱发展概述
  4. python 画系统关联图_Python基于pyecharts实现关联图绘制
  5. 大理三塔,及崇圣寺里的假深沉
  6. 0 win10重装partition_教你在安装WIN10系统中所遇到问题处理方法
  7. centos网络隔一段时间就断_如果是中专学历,以后做网络工程师会有瓶颈吗?
  8. 蓝桥杯 ADV-136算法提高 大数加法
  9. Django-组件拾遗
  10. Python 音频: sounddevice 使用 左声道/右声道/立体声 --- 播放,录音
  11. 什么软件测试出来的网速准确,百度应用的网速测试工具最不准确
  12. c语言入门教程怎么编程,从零开始的C语言入门教程-编程语言的基础
  13. 粒子群优化算法python实现
  14. GitChat · 前端 | JavaScript 进阶之 Vue.js + Node.js 入门实战开发
  15. html无法显示echarts地图,pyecharts 地图不显示问题
  16. 第52届格莱美大奖完全获奖名单
  17. DeepLearning论文阅读笔记(一):Cyclical Learning Rates for Training Neural Networks(CLR)
  18. mysql忘记密码win10,如何巧妙解决处理深度技术Win10系统忘记Mysql密码
  19. Entity Framework Code First使用者的福音 --- EF Power Tool使用记之一
  20. mysql动态增添字段实现

热门文章

  1. 05-python中的异常
  2. jquery页面隐藏和展开之间切换
  3. DIV的摇晃效果---jquery实现
  4. CSS文件未加载浏览器报警告:Resource interpreted as Stylesheet but transferred with MIME type text/html...
  5. linux 下socket通信,client断开service退出解决办法
  6. Spring Security 02
  7. 金数据表单接口请求(php)
  8. 如何正确在IDEA 里maven构建的项目中引入lib的jar包(图文详解)
  9. 数据库的水平扩展与垂直扩展
  10. 【转】linux常用命令:find、grep