神经网络文本分类(一)
01 基于卷积神经网络的文本分类模型详解
1.1什么是卷积神经网络
卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一。卷积神经网络具有表征学习(representation learning)能力,能够按其阶层结构对输入信息进行平移不变分类(shift-invariant classification),因此也被称为“平移不变人工神经网络(Shift-Invariant Artificial Neural Networks, SIANN)”
理解“卷积”参考博客《最容易理解的对卷积(convolution)的解释》 在神经网络模型中常见的二维卷积操作如下:
1x1+0x0+0x1+1x0+1x1+0x0+1x1+1x0+1x1 = 4
故神经网络中卷积相当于将滤子中的元素与原始输入对应位置的元素进行元素相乘再加总的操作。而一个滤子可以通过某种特定的数字排列,从而突出某种特征模式,滤出特定的特征,凸显出图片中某些特征的输出。
如何在keras中使用自己定制的滤子呢?
可以可以通过定制kernel, 输入给定的矩阵实现
- 因为一般输入的滤子都是一个2-D矩阵,所以首先需要将数据复制到一个4-D的矩阵
def my_init(shape,dtype=None):
new_mat = np.zeros((shape[0],shape[1],3,3))
for i in range(shape[0]):
for j in range(shape[1]):
new_mat[:,:,i,j] = filter_mat
return np.array(new_mat,dtype=dtype)
- 其次,定义一个简单的保函一个2D卷积层的网络模型,激活函数均使用线性函数,防止变形
model = Sequential()
model.add(Covn2(depth,
kernel_size=kernel_size,
input_size=input_size,
padding='same',
activation='linear',
data_format='channels_last',
kernel_initializer=my_init,
name='Conv'))
model.add(Dense(1,activation='linear'))
model.compile(loss='mse',optimizer='sgd')
model.summary()
- 抽取该模型的卷积层输出:
inX = model.input
outputs = [layes.output for layer in model.layers if layer.name='Conv']
functions = [K.function([inX],[out]) for out in outputs]
layer_outs = [func([img_data.reshape(1,raw,col,depth)]) for func in functions]
activationLayer = layer_outs[0][0]
具体可参考Keras中文文档《编写你自己的 Keras 层》
1.2卷积神经网络模型中的一些概念
- 步长(Strides)指水平滑动和垂直滑动步长值,各个神经网络框架中都不同的设置方式。
- 池化(Pooling)即池化层也称下采样层,会压缩输入的特征图,一方面减少了特征,导致了参数减少,进而简化了卷积网络计算时的复杂度;另一方面保持了特征的某种不变性(旋转、平移、伸缩等)。池化操作主要有两种,一种是平均池化(Average Pooling),即对邻域内的特征点求平均;另一种是最大池化(Max Pooling),即对邻域内的特征点取最大。简而言之,池化就是去除杂余信息,保留关键信息。池化能池化能有效压缩信息的维度, 提取局部范围内最“突出” 的信息。如图
- 补齐(Padding)为了保障CNN的输出维度是否保持与输入矩阵大小一致。
- 拉平(Flatten)就是将高维度数据拉至一维,为了让卷积层的输出能被下游的全连接层接受,Keras中对于Conv2D的结果拉平可以通过
Flatten / GlobalMaxPooling
函数。
1.3一维卷积神经网络应用于文字
实际中把一句话可以看作是以一个单词索引下表表示的列表,因为索引没有重要的意义,因此当把每个单词都映射到致密空间后(即通过嵌入层生成词向量),我们就可以使用卷积网络了。
1.4 二维卷积神经网络应用于文字
二维卷积可以在更多的单词的嵌入层维度上进行卷积操作。比如在相邻的两个词一段的局部词向量之间进行卷积,但卷积结果的一个多维的数据,因此需要用reshape
调整维度后,再进行后续的池化等操作。
二维卷积网络的主要差异在于:
- 嵌入层的输出直接使用Reshape“明确“将维度修改为4D后在输入卷积层
- 卷积层使用的滤子是2D滤子, 可以将相邻的元素合并处理后输出
注意:
Conv1D:输入输出都是3D
- 输入: (样本, 步, 频道)
- 输出: (样本, 新步数, 滤子数)
Conv2D: 输入输出都是4D
输入: (样本, 行, 列, 频道)
输出: (样本, 新行数, 新列数,滤子数)