目录
卷积神经网络(CNN)是人工神经网络(ANNs)的一种高级版本,主要设计用于从类似网格的矩阵数据集中提取特征。这对于图像或视频等视觉数据集特别有用,在这些数据集中,数据模式起着至关重要的作用。
由于CNN在处理视觉数据方面的有效性,它们被广泛应用于计算机视觉应用中。CNN由多个层组成,如输入层、卷积层、池化层和全连接层。
编辑
卷积层的工作原理
卷积神经网络是共享参数的神经网络。想象一下,你有一张图像。它可以表示为一个长方体,具有长度、宽度(图像的维度)和高度(即通道,因为图像通常有红、绿、蓝通道)。
编辑
现在想象一下,取这张图像的一小块区域,在上面运行一个小型神经网络,这个网络也称为滤波器或内核,比如说它有K个输出,并将这些输出纵向排列。现在,将这个神经网络在整个图像上滑动,结果是,我们会得到另一张具有不同宽度、高度和深度的图像。现在,我们不再只有R、G和B通道,而是有更多的通道,但宽度和高度会变小。这种操作称为卷积。如果小块区域的大小与图像的大小相同,那它将是一个常规的神经网络。
编辑
卷积的数学原理
现在我们来谈谈整个卷积过程中涉及的一些数学知识。
- • 卷积层由一组可学习的滤波器(或内核)组成,这些滤波器的宽度和高度较小,深度与输入体积相同(如果输入层是图像输入,则为3)。
- • 例如,如果我们要对尺寸为34x34x3的图像进行卷积。滤波器的可能尺寸为axax3,其中“a”可以是3、5或7等任何值,但与图像尺寸相比要小。
- • 在正向传播过程中,我们逐步将每个滤波器在整个输入体积上滑动,每一步称为步幅(对于高维图像,步幅的值可以是2、3甚至4),并计算内核权重与输入体积中的小块之间的点积。
- • 当我们滑动滤波器时,每个滤波器会得到一个二维输出,我们将它们堆叠在一起,结果将得到一个深度等于滤波器数量的输出体积。网络将学习所有的滤波器。
构建卷积神经网络
一个完整的卷积神经网络架构也被称为卷积网络。卷积网络是一系列的层,每一层通过一个可微函数将一个数据体转换为另一个数据体。
我们以在一个尺寸为32×32×3的图像上运行卷积网络为例。
- 输入层:这是我们向模型输入数据的层。在卷积神经网络中,通常输入将是一张图像或一系列图像。该层保存着图像的原始输入,宽度为32,高度为32,深度为3。
- 卷积层:这一层用于从输入数据集中提取特征。它将一组可学习的滤波器(称为内核)应用于输入图像。滤波器/内核是较小的矩阵,通常形状为2×2、3×3或5×5。它在输入图像数据上滑动,并计算内核权重与相应输入图像块之间的点积。该层的输出被称为特征图。假设我们在这一层总共使用12个滤波器,我们将得到一个尺寸为32×32×12的数据体输出。
- 激活层:通过在前面一层的输出上添加激活函数,激活层为网络增加非线性。它将对卷积层的输出应用逐元素激活函数。一些常见的激活函数有ReLU:max(0, x)、Tanh、Leaky ReLU等。数据体大小保持不变,因此输出数据体的尺寸仍为32×32×12。
- 池化层:这一层定期插入到卷积网络中,其主要功能是减小数据体的大小,这使得计算速度加快,减少内存使用,同时还能防止过拟合。两种常见的池化层类型是最大池化和平均池化。如果我们使用2×2滤波器和步长为2的最大池化,结果数据体的尺寸将为16×16×12。
编辑
- 扁平化:在卷积层和池化层之后,得到的特征图被扁平化为一维向量,以便可以将其输入到全连接层进行分类或回归。
- 全连接层:它接收来自前一层的输入,并计算最终的分类或回归任务。
编辑
- 输出层:全连接层的输出随后被输入到一个用于分类任务的逻辑函数中,如 sigmoid 或 softmax,该函数将每个类别的输出转换为每个类别的概率得分。
CNN网络在图像中的应用
让我们考虑一幅图像,并使用CNN来提取其内部特征。
编辑
步骤:
- 导入必要的库
- 设置参数
- 定义内核
- 加载图像并绘制它。
- 重新格式化图像
- 应用卷积层操作并绘制输出图像。
- 应用激活层操作并绘制输出图像。
- 应用池化层操作并绘制输出图像。
# import the necessary libraries
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from itertools import product
# set the param
plt.rc('figure', autolayout=True)
plt.rc('image', cmap='magma')
# define the kernel
kernel = tf.constant([[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1],
])
# load the image
image = tf.io.read_file('Ganesh.jpg')
image = tf.io.decode_jpeg(image, channels=1)
image = tf.image.resize(image, size=[300, 300])
# plot the image
img = tf.squeeze(image).numpy()
plt.figure(figsize=(5, 5))
plt.imshow(img, cmap='gray')
plt.axis('off')
plt.title('Original Gray Scale image')
plt.show();
# Reformat
image = tf.image.convert_image_dtype(image, dtype=tf.float32)
image = tf.expand_dims(image, axis=0)
kernel = tf.reshape(kernel, [*kernel.shape, 1, 1])
kernel = tf.cast(kernel, dtype=tf.float32)
# convolution layer
conv_fn = tf.nn.conv2d
image_filter = conv_fn(
input=image,
filters=kernel,
strides=1, # or (1, 1)
padding='SAME',
)
plt.figure(figsize=(15, 5))
# Plot the convolved image
plt.subplot(1, 3, 1)
plt.imshow(
tf.squeeze(image_filter)
)
plt.axis('off')
plt.title('Convolution')
# activation layer
relu_fn = tf.nn.relu
# Image detection
image_detect = relu_fn(image_filter)
plt.subplot(1, 3, 2)
plt.imshow(
# Reformat for plotting
tf.squeeze(image_detect)
)
plt.axis('off')
plt.title('Activation')
# Pooling layer
pool = tf.nn.pool
image_condense = pool(input=image_detect,
window_shape=(2, 2),
pooling_type='MAX',
strides=(2, 2),
padding='SAME',
)
plt.subplot(1, 3, 3)
plt.imshow(tf.squeeze(image_condense))
plt.axis('off')
plt.title('Pooling')
plt.show()
编辑
编辑
卷积神经网络的优点:
-
擅长检测图像、视频和音频信号中的模式和特征。
- 对平移、旋转和缩放不变性具有鲁棒性。
- 端到端训练,无需手动特征提取。
- 能够处理大量数据并实现高精度。
卷积神经网络的缺点:
- 训练计算成本高,需要大量内存。
- 如果数据不足或未使用适当的正则化,容易过拟合。
- 需要大量有标记的数据。
- 可解释性有限,很难理解网络学到了什么。