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