卷积神经网络基础
- 卷积运算的定义、动机(稀疏权重、参数共享、等变表示)。一维卷积运算和二维卷积运算。
- 反卷积(tf.nn.conv2d_transpose)
- 池化运算的定义、种类(最大池化、平均池化等)、动机。
- Text-CNN的原理。
- 利用Text-CNN模型来进行文本分类。
一、卷积运算的定义、动机(稀疏权重、参数共享、等变表示)
-
卷积的定义:卷积是对两个实变函数的一种数学运算。
卷积运算通常用星号表示:s(t)=(x∗w)(t)
在卷积网络的术语中,卷积的第一个参数(函数 x)通常叫做输入(input),第二个参数(函数 w)叫做核函数(kernel function),输出被称作特征映射(feature map)。在机器学习的应用中,输入通常是多维数组的数据,而核通常是由学习算法优化得到的多维数组的参数。我们通常假设在存储了数值的有限点集以外,卷积函数的值都为零,因而我们可以通过对有限个数组元素的求和来计算卷积。卷积运算通常会在多个维度上进行。
-
卷积的动机:
卷积运算通过三个重要的思想来帮助改进机器学习系统: 稀疏交互(sparse interactions)、参数共享(parameter sharing)、等变表示(equivariant representa-tions)。另外,卷积提供了一种处理大小可变的输入的方法。1)稀疏交互:传统的神经网络使用矩阵乘法来建立输入与输出的连接关系,每一个输出单元与每一个输入单元都产生交互。然而,卷积网络具有稀疏交互(sparse interactions)的特征,这是通过使核的大小远小于输入的大小来达到的。
如果有 m 个输入和 n 个输出,那么矩阵乘法需要 m×n个参数并且相应算法的时间复杂度为 O(m×n)。如果我们限制每一个输出拥有的连接数为 k,那么稀疏的连接方法只需要 k×n 个参数以及O(k×n) 的运行时间。在实际应用中,只需保持 k 比 m小几个数量级,就能在机器学习的任务中取得好的表现。
2)参数共享:参数共享(parameter sharing)是指在一个模型的多个函数中使用相同的参数。
在传统的神经网络中,当计算一层的输出时,权重矩阵的每一个元素只使用一次。而在卷积神经网络中,核的每一个元素都作用在输入的每一位置上(是否考虑边界像素取决于对边界决策的设计)。卷积运算中的参数共享保证了我们只需要学习一个参数集合,而不是对于每一位置都需要学习一个单独的参数集合。
3)等变表示:如果一个函数满足输入改变,输出也以同样的方式改变这一性质,我们就说它是等变(equivariant)的。特别地,如果函数 f(x) 与 g(x)满足 f(g(x))=g(f(x)), 我们就说 f(x) 对于变换 g 具有等变性。
二、一维卷积运算和二维卷积运算
- 一维卷积:
python代码:
conv1d(value,filters, stride, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
给定三维的输入张量和滤波器来进行1维卷积计算。
input:3维张量,形状shape和data_format有关:
(1)data_format = "NWC", shape = [batch, in_width, in_channels]
(2)data_format = "NCW", shape = [batch, in_channels, in_width]
filters:3维张量,shape = [filter_width, in_channels, out_channels],
stride:滤波器窗口移动的步长,为一个整数。
padding:边界填充算法参数,有两个值:‘SAME’、‘VALID’。具体差别体现在卷积池化后,特征图的大小变化上面。
#conv1d完整源码:
def conv1d(value,
filters,
stride,
padding,
use_cudnn_on_gpu=None,
data_format=None,
name=None):
with ops.name_scope(name, "conv1d", [value, filters]) as name:
# Reshape the input tensor to [batch, 1, in_width, in_channels]
if data_format is None or data_format == "NHWC" or data_format == "NWC":
data_format = "NHWC"
spatial_start_dim = 1
strides = [1, 1, stride, 1]
elif data_format == "NCHW" or data_format == "NCW":
data_format = "NCHW"
spatial_start_dim = 2
strides = [1, 1, 1, stride]
else:
raise ValueError("data_format must be \"NWC\" or \"NCW\".")
value = array_ops.expand_dims(value, spatial_start_dim