详解文本分类之DeepCNN的理论与实践

本文涉及的产品
函数计算FC,每月免费额度15元,12个月
简介:

导读

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

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

深度卷积神经网络(deep_CNN)

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

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

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

Transformer(目前常用于NMT)

etc..

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

DeepCNN

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

1fc49a6cfed10a69903eedc9763231df254ecf89

我大概描述下这个过程,比如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_size
       self.word_num = vocab.m_size
       self.pre_embed_path = opts.pre_embed_path
       self.string2id = vocab.string2id
       self.embed_uniform_init = opts.embed_uniform_init
       self.stride = opts.stride
       self.kernel_size = opts.kernel_size
       self.kernel_num = opts.kernel_num
       self.label_num = label_vocab.m_size
       self.embed_dropout = opts.embed_dropout
       self.fc_dropout = opts.fc_dropout

       self.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 convs
       self.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_num
       self.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 = l
       l = []
       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 = l
       l = []
       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

数据对比

00013719aad4cfbfc7d686db2000cc3bfd94a4a6

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

原文发布时间为:2018-11-8

原文作者:zenRRan

本文来自云栖社区合作伙伴“深度学习自然语言处理”,了解相关信息可以关注“深度学习自然语言处理”。

相关实践学习
基于函数计算一键部署掌上游戏机
本场景介绍如何使用阿里云计算服务命令快速搭建一个掌上游戏机。
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的迁移学习:从理论到实践
科技进步不断推动人工智能的发展,其中深度学习已成为最炙手可热的领域。然而,训练深度学习模型通常需要大量的数据和计算资源,这对于许多实际应用来说是一个显著的障碍。迁移学习作为一种有效的方法,通过利用已有模型在新任务上的再训练,大大减少了数据和计算资源的需求。本文将详细探讨迁移学习的理论基础、各种实现方法以及其在实际应用中的优势和挑战。
|
11月前
|
机器学习/深度学习 算法 前端开发
经典机器学习系列(六)【集成学习】
经典机器学习系列(六)【集成学习】
173 2
|
25天前
|
机器学习/深度学习 数据采集 人工智能
探索机器学习:从理论到实践
【6月更文挑战第19天】本文旨在为读者提供一个机器学习的全面视角,从基本概念到实际应用案例,再到面临的挑战和未来趋势。我们将通过一个实际的项目案例来深入探讨如何将机器学习理论应用于解决现实世界问题,并分享一些在项目实施过程中学到的经验和教训。无论你是机器学习领域的新手还是有经验的从业者,这篇文章都将为你提供有价值的见解和启发。
25 4
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习:从理论到实践
【6月更文挑战第4天】本文深入探讨了深度学习的理论基础和实践应用,包括其发展历程、主要模型、以及在图像识别、自然语言处理等领域的应用。文章不仅提供了对深度学习的全面理解,还通过实例展示了如何将理论知识转化为实际的技术解决方案。
|
1月前
|
机器学习/深度学习 数据采集 资源调度
【机器学习】逻辑回归:原理、应用与实践
逻辑回归(Logistic Regression)是一种广泛应用于分类问题的统计学方法,尽管其名称中含有“回归”二字,但它实际上是一种用于解决二分类或多分类问题的线性模型。逻辑回归通过使用逻辑函数(通常为sigmoid函数)将线性模型的输出映射到概率空间,从而预测某个事件发生的概率。本文将深入探讨逻辑回归的理论基础、模型构建、损失函数、优化算法以及实际应用案例,并简要介绍其在机器学习领域的地位和局限性。
261 2
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
《探索深度学习:从理论到实践》
【6月更文挑战第7天】本文将深入探讨深度学习的理论基础和实际应用,通过分析其发展历程、主要技术以及应用案例,帮助读者全面理解深度学习的重要性和实用性。我们将从基础概念出发,逐步深入到复杂的模型和算法,最后通过实例展示深度学习如何改变我们的世界。
14 0
|
2月前
|
机器学习/深度学习 自然语言处理 算法
深入解析深度学习中的卷积神经网络:从理论到实践
深入解析深度学习中的卷积神经网络:从理论到实践
50 0
|
2月前
|
机器学习/深度学习 数据采集 存储
使用机器学习算法进行文本分类的方法与实践
本文将介绍使用机器学习算法进行文本分类的方法与实践。通过分析文本特征、选择合适的机器学习算法和构建有效的训练模型,可以实现准确和高效的文本分类任务。我们还将探讨如何处理文本数据预处理、特征提取和模型评估等方面的关键问题,以帮助读者更好地应用机器学习技术解决文本分类挑战。
|
9月前
|
机器学习/深度学习 数据采集 算法
回归算法全解析!一文读懂机器学习中的回归模型
回归算法全解析!一文读懂机器学习中的回归模型
583 0