CNN神经网络Python实战

195 阅读8分钟

目录

卷积层的工作原理 

卷积的数学原理

构建卷积神经网络

 CNN网络在图像中的应用

卷积神经网络的优点:

擅长检测图像、视频和音频信号中的模式和特征。

卷积神经网络的缺点:


       

 卷积神经网络(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来提取其内部特征。 

​编辑

步骤:

  1. 导入必要的库
  2. 设置参数
  3. 定义内核
  4. 加载图像并绘制它。
  5. 重新格式化图像
  6. 应用卷积层操作并绘制输出图像。
  7. 应用激活层操作并绘制输出图像。
  8. 应用池化层操作并绘制输出图像。 
# 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()

 ​编辑

​编辑

卷积神经网络的优点:

  1. 擅长检测图像、视频和音频信号中的模式和特征。

  2.  对平移、旋转和缩放不变性具有鲁棒性。
  3. 端到端训练,无需手动特征提取。
  4. 能够处理大量数据并实现高精度。

卷积神经网络的缺点:

  1. 训练计算成本高,需要大量内存。
  2. 如果数据不足或未使用适当的正则化,容易过拟合。
  3. 需要大量有标记的数据。
  4. 可解释性有限,很难理解网络学到了什么。