在深度学习的图像分析领域,卷积神经网络(CNN)已经成为处理图像相关问题的基石。尽管像ResNet、GoogleNet这样的架构在图像分类任务中取得了卓越的准确率,但它们在训练大型数据集时也存在一些缺陷,其中之一就是训练时间较长。为了解决这个问题,可分离卷积技术应运而生。
首先,来理解一下什么是传统卷积。根据维基百科的定义,卷积是一种数学运算,它对两个函数进行操作,产生第三个函数,该函数表达了一个函数的形状是如何被另一个函数修改的。在二维卷积中,一个二维核(kernel)在二维输入矩阵上滑动,与当前覆盖的部分进行矩阵乘法,然后将结果矩阵汇总到单个像素中。
可分离卷积是一种将单个卷积分解为两个或更多卷积以产生相同输出的过程。这个过程将单一过程分解为两个或更多子过程以实现相同的效果。主要有两种类型的可分离卷积:空间可分离卷积和深度可分离卷积。
在图像中,高度和宽度被称为空间轴。可以沿空间轴分离的核被称为空间可分离核。核被分解为两个更小的核,这些核依次与输入图像相乘,以获得完整核的相同效果。例如,Prewitt核就是这样一个空间可分离核,它用于检测图像中的边缘。
# 假设有一个7x7x3的图像输入。确保深度卷积后,中间图像的深度保持不变。
# 这是通过使用3个形状为3x3x1的核来实现的。每个核仅在图像的一个通道上迭代,产生一个形状为5x5x1的中间输出,
# 这些输出堆叠在一起,创建一个形状为5x5x3的输出。
# 在深度卷积之后,有一个形状为5x5x3的中间输出。现在需要增加输出的深度,
# 这是通过使用一个形状为1x1xdepth的核来实现的,这种卷积被称为点卷积。
# 假设深度是32。那么在点卷积之后,输出将具有形状5x5x32。
# 这相当于使用32个形状为5×5的滤波器进行卷积。
# 构建一个常规CNN模型
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(8, 7, input_shape=(28,28,1), strides=2),
tf.keras.layers.Conv2D(16, 5, strides=2),
tf.keras.layers.Conv2D(32, 3),
tf.keras.layers.GlobalAveragePooling2D(),
tf.keras.layers.Dense(10, activation='softmax')
])
# 构建一个深度可分离CNN模型
model = tf.keras.Sequential([
tf.keras.layers.SeparableConv2D(8, 7, input_shape=(28,28,1), strides=2),
tf.keras.layers.SeparableConv2D(16, 5, strides=2),
tf.keras.layers.SeparableConv2D(32, 3),
tf.keras.layers.GlobalAveragePooling2D(),
tf.keras.layers.Dense(10, activation='softmax')
])