task7 卷积网络

本文详细介绍了卷积网络的基本概念,包括二维卷积和一维卷积的运算原理,以及反卷积和池化运算。重点讲解了Text-CNN在文本分类中的应用,阐述了其利用卷积和池化抽取文本特征进行分类的机制。
摘要由CSDN通过智能技术生成

1 卷积运算

卷积运算是指从图像的左上角开始,开一个与模板同样大小的活动窗口,窗口图像与模板像元对应起来相乘再相加,并用计算结果代替窗口中心的像元亮度值。然后,活动窗口向右移动一列,并作同样的运算。以此类推,从左到右、从上到下,即可得到一幅新图像。

1.1 二维卷积

在这里插入图片描述
图中的输入的数据维度为14×14,过滤器大小为5×5,二者做卷积,输出的数据维度为10×10(14−5+1=10)。

上述内容没有引入channel的概念,也可以说channel的数量为1。如果将二维卷积中输入的channel的数量变为3,即输入的数据维度变为(14×14×3)。由于卷积操作中过滤器的channel数量必须与输入数据的channel数量相同,过滤器大小也变为5×5×3。在卷积的过程中,过滤器与数据在channel方向分别卷积,之后将卷积后的数值相加,即执行10×10次3个数值相加的操作,最终输出的数据维度为10×10。

以上都是在过滤器数量为1的情况下所进行的讨论。如果将过滤器的数量增加至16,即16个大小为10×10×3的过滤器,最终输出的数据维度就变为10×10×16。可以理解为分别执行每个过滤器的卷积操作,最后将每个卷积的输出在第三个维度(channel 维度)上进行拼接。

二维卷积常用于计算机视觉、图像处理领域。

1.2 一维卷积

在这里插入图片描述
图中的输入的数据维度为8,过滤器的维度为5。与二维卷积类似,卷积后输出的数据维度为8−5+1=4。

如果过滤器数量仍为1,输入数据的channel数量变为16,即输入数据维度为8×16。这里channel的概念相当于自然语言处理中的embedding,而该输入数据代表8个单词,其中每个单词的词向量维度大小为16。在这种情况下,过滤器的维度由5变为5×16,最终输出的数据维度仍为4。

如果过滤器数量为n,那么输出的数据维度就变为4×n。

一维卷积常用于序列模型,自然语言处理领域。

2 反卷积

反卷积(Deconvolution)的概念第一次出现是Zeiler在2010年发表的论文Deconvolutional networks中,但是并没有指定反卷积这个名字,反卷积这个术语正式的使用是在其之后的工作中(Adaptive deconvolutional networks for mid and high level feature learning)。随着反卷积在神经网络可视化上的成功应用,其被越来越多的工作所采纳比如:场景分割、生成模型等。其中反卷积(Deconvolution)也有很多其他的叫法,比如:Transposed Convolution,Fractional Strided Convolution等等。

在这里插入图片描述

在这里插入图片描述

3 池化运算

池化层的输入一般来源于上一个卷积层,主要的作用是提供了很强的鲁棒性。(例如max-pooling是取一小块区域中的最大值,此时若此区域中的其他值略有变化,或者图像稍有平移,pooling后的结果仍不变),并且减少了参数的数量,防止过拟合现象的发生。池化层一般没有参数,所以反向传播的时候,只需对输入参数求导,不需要进行权值更新。

max-pooling
在这里插入图片描述
mean-pooling
在这里插入图片描述

4 Text-CNN原理

CNN在计算机视觉领域取得了很好的结果,同时它可以应用在文本分类上面。
文本分类的关键在于准确提炼文档或者句子的中心思想,而提炼中心思想的方法是抽取文档或句子的关键词作为特征,基于这些特征去训练分类器并分类。因为CNN的卷积和池化过程就是一个抽取特征的过程,当我们可以准确抽取关键词的特征时,就能准确的提炼出文档或句子的中心思想。 卷积神经网络首次应用于文本分类可以说是在2004年Yoon Kim 在 “Convolutional Neural Networks for Sentence Classification” 一文中提出,接下来将介绍text-CNN模型。
在这里插入图片描述
论文使用的模型主要包括五层,第一层是embedding layer,第二层是convolutional layer,第三层是max-pooling layer,第四层是fully connected layer,最后一层是softmax layer。下图具体展示了如何使用cnn进行句子分类。
在这里插入图片描述

  • 这里word embedding的维度是5。对于句子 i like this movie very
    much。可以转换成如上图所示的矩阵AϵR7×5AϵR7×5
  • 有6个卷积核,尺寸为(2×5)(2×5), (3×5)(3×5), 4×54×5,每个尺寸各2个.
  • A分别与以上卷积核进行卷积操作,再用激活函数激活。每个卷积核都得到了特征向量(feature maps)
  • 使用1-max pooling提取出每个feature map的最大值,然后在级联得到最终的特征表达。
  • 将特征输入至softmax layer进行分类, 在这层可以进行正则化操作( l2-regulariation)

5 Text-CNN文本分类

from __future__ import print_function

from hbconfig import Configimport tensorflow as tffrom tensorflow.contrib import layers
import text_cnn

class Model:
    def __init__(self):      
      pass
    def model_fn(self, mode, features, labels, params):       
        self.dtype = tf.float32
        self.mode = mode        
        self.params = params
        self.loss, self.train_op, self.metrics, self.predictions = None, None, None, None        
        self._init_placeholder(features, labels)        
        self.build_graph()
        # train mode: required loss and train_op       
        # eval mode: required loss        
        # predict mode: required predictions
        return tf.estimator.EstimatorSpec(mode=mode,loss=self.loss,train_op=self.train_op,eval_metric_ops=self.metrics,predictions={"prediction": self.predictions})   
    def _init_placeholder(self, features, labels):       
    	 self.input_data = features        
    	 if type(features) == dict:            
    	    self.input_data = features["input_data"]
         self.targets = labels
         
    def build_graph(self):       
        graph = text_cnn.Graph(self.mode)       
        output = graph.build(self.input_data)
        self._build_prediction(output)        
	if self.mode != tf.estimator.ModeKeys.PREDICT:            			
	   self._build_loss(output)           
	   self._build_optimizer()            
	   self._build_metric()
    
    def _build_loss(self, output):        
    	self.loss = tf.losses.softmax_cross_entropy( self.targets,  self.targets,  output,scope="loss")
    
    def _build_prediction(self, output):        
    	tf.argmax(output[0], name='train/pred_0')         
    	self.predictions = tf.argmax(output, axis=1)
    
    def _build_optimizer(self):        
    	 self.train_op = layers.optimize_loss( self.loss, tf.train.get_global_step(), optimizer='Adam', learning_rate=Config.train.learning_rate, ummaries=['loss', 'learning_rate'],name="train_op")
    
    def _build_metric(self):       
    	 self.metrics = { "accuracy": tf.metrics.accuracy(tf.argmax(self.targets, axis=1), self.predictions)}

参考:
https://blog.csdn.net/qq_34840129/article/details/86666023
https://blog.csdn.net/itleaks/article/details/80336825
https://blog.csdn.net/l691899397/article/details/52250190
https://blog.csdn.net/vivian_ll/article/details/80831509
https://blog.csdn.net/John_xyz/article/details/79210088?utm_source=blogxgwz1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值