字符级卷积神经网络(Char-CNN)实现文本分类--模型介绍与TensorFlow实现

本篇博客主要用于记录“Character-level Convolutional Networks for Text Classification”论文的模型架构和仿真实现方法。这是一篇2016年4月份刚发的文章,在此之前,原作者还发表过一篇“Text Understanding from Scratch”的论文,两篇论文基本上是一样的,不同之处在于后者从写了Introduction部分,然后又补充做了很多实验。第一次见到这种,还是惊呆了我自己,因为中间一章模型架构原封不动的搬移了过来,没有任何改变==好了,不多说,下面来介绍论文中所提出的模型,此外,这部分代码我将放在自己的gihub上面

模型架构

在此之前很多基于深度学习的模型都是使用更高层面的单元对文本或者语言进行建模,比如单词(统计信息或者n-grams、word2vec等),短语(phrases),句子(sentence)层面,或者对语义和语法结构进行分析,但是本文则提出了从字符层面进行文本分类,提取出高层抽象概念。这样做的好处是不需要使用预训练好的词向量和语法句法结构等信息。除此之外,字符级还有一个好处就是可以很容易的推广到所有语言。首先看一下模型架构图:
这里写图片描述
1,字符编码层
为了实现Char-CNN,首先要做的就是构建字母表,本文中使用的字母标如下,共有69个字符,对其使用one-hot编码,外加一个全零向量(用于处理不在该字符表中的字符),所以共70个。文中还提到要反向处理字符编码,即反向读取文本,这样做的好处是最新读入的字符总是在输出开始的地方。:

abcdefghijklmnopqrstuvwxyz0123456789
-,;.!?:’’’/\|_@#$%ˆ&*˜‘+-=<>()[]{}

2,模型卷积-池化层
文中提出了两种规模的神经网络–large和small。都由6个卷积层和3个全连接层共9层神经网络组成。这里使用的是1-D卷积神经网络。除此之外,在三个全连接层之间加入两个dropout层以实现模型正则化。其参数配置如下图所示:
这里写图片描述
这里写图片描述
上图中第九层也就是输出层的输出单元个数没有标明,是因为针对不同任务取决于具体的类别数。

使用同义词词库替换数据集

论文中说到深度学习中为了减少模型的泛化误差,经常会对数据集进行一定程度的改动,比如说图像处理中对图片进行缩放、平移、旋转等操作不会改变图片本身含义;语音识别中对语音的声调、语速、噪声也不会改变其结果。但是在文本处理中,却不能随意挑换字符顺序,因为顺序就代表了语义。所以其提出使用同义词替换技术实现对数据集的处理。为了实现该技术,需要解决两个问题:

  1. 哪些词应当被替换
  2. 应该是用哪个同义词来替换该词
    其提出以一定概率的方式随机进行选择,如下图所示,其中q和p都取0.5。但是本文不会对这部分进行代码实现。
    这里写图片描述

数据集和数据预处理

本文仿真的是AG’s news新闻分类数据集。其包含了496835个新闻,我们选择其中4个最大的类别,每个选出30000篇文章用于训练,1900篇用于测试。数据集如下图所示,每一行有三项,第一项是类别,第二项是title,第三项是描述。我们使用二三项连接起来作为训练数据,这里我们设置每天训练数据的字符长度最大为1014,所以最终每个样本数据会被转化为1014*69的矩阵传入神经网络:
这里写图片描述
数据预处理部分代码如下所示:

class Data(object):
    #定义一些全局变量、超参数
    def __init__(self,
                 data_source,
                 alphabet="abcdefghijklmnopqrstuvwxyz0123456789-,;.!?:'\"/\\|_@#$%^&*~`+-=<>()[]{}",
                 l0=1014,
                 batch_size=128,
                 no_of_classes=4):

        self.alphabet = alphabet
        self.alphabet_size = len(self.alphabet)
        self.dict = {}
        self.no_of_classes = no_of_classes
        for i, c in enumerate(self.alphabet):
            self.dict[c] = i + 1


        self.length = l0
        self.batch_size = batch_size
        self.data_source = data_source

    def loadData(self):
        data = []
        with open(self.data_source, 'rb') as f:
            rdr = csv.reader(f, delimiter=',', quotechar='"')
            #将每行数据的二三项进行处理拼接得到文本
            for row in rdr:
                txt = ""
                for s in row[1:]:
                    txt = txt + " " + re.sub("^\s*(.-)\s*$", "%1", s).replace("\\n", "\n")
                #第一项为标签,构造训练数据
                data.append ((int(row[0]), txt))

        self.data = np.array(data)
        self.shuffled_data = self.data

    
  • 10
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 40
    评论
很好,这是一个非常有趣的话题!我可以给您一些关于卷神经网络(CNN)和车牌识别的基本实现方法,希望能帮到您。 首先,卷神经网络是一种深度学习算法,用于图像分类、物体检测等任务。它的主要思想是通过多层卷和池化操作,逐渐提取图像中的特征,最终得到图像的表示。在车牌识别中,我们可以将车牌图像作为输入,通过卷神经网络,得到车牌上的字符和数字信息,从而实现车牌识别。 下面是一个简单的车牌识别的CNN实现过程: 1. 数据准备 首先,我们需要收集一些车牌图像数据,并将其划分为训练集和测试集。训练集用于训练CNN模型,测试集用于评估模型的性能。 2. 数据预处理 对于车牌图像数据,我们需要进行一些预处理,以便于CNN模型的训练和测试。常见的预处理操作包括:图像缩放、图像裁剪、图像旋转、图像灰度化、图像归一化等。 3. 搭建CNN模型 接下来,我们需要搭建CNN模型。常见的CNN模型包括LeNet、AlexNet、VGG、ResNet等。在车牌识别中,我们可以选择简单的LeNet模型或者更加复杂的VGG模型。 4. 训练CNN模型 将训练集输入到CNN模型中,通过反向传播算法,更新CNN模型的权重。训练过程中,可以使用交叉熵损失函数和随机梯度下降算法等。 5. 测试CNN模型 将测试集输入到CNN模型中,得到模型的预测结果。可以使用准确率、召回率、F1值等指标,评估模型的性能。 6. 应用CNN模型 最后,将训练好的CNN模型应用到车牌识别中。将车牌图像输入到CNN模型中,得到车牌上的字符和数字信息。 以上是一个简单的车牌识别CNN实现过程,具体的实现方法还需要根据具体的需求和数据进行调整和优化。希望对您有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值