卷积神经网络是什么(附带实例)
卷积神经网络(Convolutional Neural Networks,CNN)是一种专门处理具有网格结构数据的深度学习模型。CNN 已经在图像处理领域(如图像分类、物体检测和人脸识别)取得了巨大的成功。
网格结构的数据是指数据存在一种结构化的排列方式,各个数据点在空间上相互关联,形成了一种网格状布局。这种布局方式非常适合用来表示图像、音频等类型的数据。
例如,图像数据可以被看作一个二维的网格,其中每个像素点都对应网格中的一个位置,有行和列坐标。每个像素点都包含颜色信息。在彩色图像中,通常用 RGB 三个通道的值表示颜色信息。这种二维的网格结构可以方便地表示图像中的各种信息,包括色彩、纹理、形状和对象等。
音频数据可以被看作一个一维的网格,其中每个样本点都对应网格中的一个位置,有时间坐标。每个样本点都包含声音的振幅信息。这种一维的网格结构可以方便地表示音频中的各种信息,包括节奏、音调、音色和旋律等。
CNN 的核心思想是局部感知字段和权值共享。局部感知字段意味着每个神经元不再是全连接的,而只是连接到输入数据的一个小的局部区域,这能大幅减少模型的参数。权值共享是指在空间维度上,不同位置的神经元可以使用同一组权值,这能减少参数的数量,并能引入平移不变性,即无论目标物体在图像的哪个位置,CNN 都能有效检测到。
全连接(Fully Connected)是指一层中的神经元与上一层的所有神经元都有连接。例如,在一个全连接层中,每个神经元都接收上一层所有神经元的输出作为输入。这种设计使每个神经元都有机会从所有的信息中提取特征。
然而,在卷积神经网络中,一个重要的设计思想是局部感知字段,也就是说,每个神经元并不与上一层的所有神经元连接,而是只连接到输入数据的一个小的局部区域,如一个 5×5 的像素块。这样做的好处是可以大大减少模型的参数数量,从而减少过拟合的风险,并提高计算效率。
一个典型的 CNN 结构包含三种类型的层:卷积层、池化层和全连接层。
1) 卷积层用于提取输入的局部特征。
2) 池化层用于降低数据的空间大小,减少计算量,同时提供一定程度的平移不变性。平移不变性是指当图像或数据的位置发生微小改变时,模型的预测能力不会受到影响。在卷积神经网络中,它是通过权重共享实现的。
池化是一种降低数据维度的操作。例如,最大池化(Max Pooling)是取一块区域内的最大值作为该区域的代表。这样一来,即使输入的特征有微小的平移,池化操作的结果也不会有太大变化,因此模型的预测能力也能在一定程度上保持不变。
3) 全连接层也称为密集层,类似于传统的神经网络层,通常在 CNN 的最后几层中使用,用于执行高级的推理和分类任务。
卷积神经网络中的每一个卷积核在处理输入数据(如图像)时,都是以同样的方式在整个输入数据上滑动并进行计算的。这意味着无论目标特征(如图像中的某个物体)在何处,卷积核都能以同样的方式对其进行检测。这种设计使模型对输入数据的位置具有一定程度的鲁棒性,即模型的预测能力不会因为输入数据的平移而受到太大影响。
以下是一个简单的 CNN 模型示例,使用 Keras 库对 MNIST 数据集进行图像分类:
MNIST 数据集包含 60000 个训练样本和 10000 个测试样本,每个样本都是一幅 28 像素×28 像素的灰度图像,代表 0~9 的十个数字中的一个。每一幅图像都被标注了对应的真实数字。
在图像的每个像素中,数字 0 代表白色,数字 255 代表黑色,数字在这两者之间的表示不同的灰度级别。因此,一个图像可以表示为一个 28×28 的矩阵,矩阵中的每个元素都是一个 0~255 的整数。
在上面这个例子中,首先,从 Keras 的 datasets 模块中导入 MNIST 数据集。随后,将数据集的图像进行预处理,包括改变形状(使数据集适应模型的输入要求)以及归一化处理。最后,将标签转换为one-hot编码形式,以便进行多分类任务。
然后,创建一个 Sequential 模型,这是 Keras 中一种常见的线性模型结构。这个模型包含如下内容:
模型创建完成后,进行模型编译、设置优化器(这里用的是 Adam)、损失函数(这里用的是分类交叉熵损失)和评价指标(这里用的是准确率)。
接着,对模型进行训练,设置训练轮数(epochs)和每个批次的样本数量(batch_size)。
最后,用测试集对模型进行评估,打印出模型在测试集上的准确率。
卷积神经网络的设计和训练涉及许多技术和概念,包括卷积操作、ReLU 激活函数、过拟合、批量归一化、数据增强等。在实践中,通常需要结合对任务的理解和实验结果,确定如何使用网络结构及如何调整超参数。
网格结构的数据是指数据存在一种结构化的排列方式,各个数据点在空间上相互关联,形成了一种网格状布局。这种布局方式非常适合用来表示图像、音频等类型的数据。
例如,图像数据可以被看作一个二维的网格,其中每个像素点都对应网格中的一个位置,有行和列坐标。每个像素点都包含颜色信息。在彩色图像中,通常用 RGB 三个通道的值表示颜色信息。这种二维的网格结构可以方便地表示图像中的各种信息,包括色彩、纹理、形状和对象等。
音频数据可以被看作一个一维的网格,其中每个样本点都对应网格中的一个位置,有时间坐标。每个样本点都包含声音的振幅信息。这种一维的网格结构可以方便地表示音频中的各种信息,包括节奏、音调、音色和旋律等。
CNN 的核心思想是局部感知字段和权值共享。局部感知字段意味着每个神经元不再是全连接的,而只是连接到输入数据的一个小的局部区域,这能大幅减少模型的参数。权值共享是指在空间维度上,不同位置的神经元可以使用同一组权值,这能减少参数的数量,并能引入平移不变性,即无论目标物体在图像的哪个位置,CNN 都能有效检测到。
全连接(Fully Connected)是指一层中的神经元与上一层的所有神经元都有连接。例如,在一个全连接层中,每个神经元都接收上一层所有神经元的输出作为输入。这种设计使每个神经元都有机会从所有的信息中提取特征。
然而,在卷积神经网络中,一个重要的设计思想是局部感知字段,也就是说,每个神经元并不与上一层的所有神经元连接,而是只连接到输入数据的一个小的局部区域,如一个 5×5 的像素块。这样做的好处是可以大大减少模型的参数数量,从而减少过拟合的风险,并提高计算效率。
一个典型的 CNN 结构包含三种类型的层:卷积层、池化层和全连接层。
1) 卷积层用于提取输入的局部特征。
2) 池化层用于降低数据的空间大小,减少计算量,同时提供一定程度的平移不变性。平移不变性是指当图像或数据的位置发生微小改变时,模型的预测能力不会受到影响。在卷积神经网络中,它是通过权重共享实现的。
池化是一种降低数据维度的操作。例如,最大池化(Max Pooling)是取一块区域内的最大值作为该区域的代表。这样一来,即使输入的特征有微小的平移,池化操作的结果也不会有太大变化,因此模型的预测能力也能在一定程度上保持不变。
3) 全连接层也称为密集层,类似于传统的神经网络层,通常在 CNN 的最后几层中使用,用于执行高级的推理和分类任务。
卷积神经网络中的每一个卷积核在处理输入数据(如图像)时,都是以同样的方式在整个输入数据上滑动并进行计算的。这意味着无论目标特征(如图像中的某个物体)在何处,卷积核都能以同样的方式对其进行检测。这种设计使模型对输入数据的位置具有一定程度的鲁棒性,即模型的预测能力不会因为输入数据的平移而受到太大影响。
以下是一个简单的 CNN 模型示例,使用 Keras 库对 MNIST 数据集进行图像分类:
from keras.datasets import mnist from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense from keras.utils import to_categorical # 数据导入 (train_images, train_labels), (test_images, test_labels) = mnist.load_data() # 数据预处理 train_images = train_images.reshape((60000, 28, 28, 1)) train_images = train_images.astype('float32') / 255 test_images = test_images.reshape((10000, 28, 28, 1)) test_images = test_images.astype('float32') / 255 train_labels = to_categorical(train_labels) test_labels = to_categorical(test_labels) # 创建模型 model = Sequential() model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D((2, 2))) model.add(Flatten()) model.add(Dense(10, activation='softmax')) # 编译模型 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(train_images, train_labels, epochs=5, batch_size=64) # 评估模型 test_loss, test_acc = model.evaluate(test_images, test_labels) print('Test accuracy:', test_acc)上述代码的执行结果为:
D:\深度学习>python 卷积神经网络.py Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz 11490434/11490434 [==============================] - 142s 12us/step Epoch 1/5 938/938 [==============================] - 17s 17ms/step - loss: 0.1973 - accuracy: 0.9434 Epoch 2/5 938/938 [==============================] - 19s 21ms/step - loss: 0.0599 - accuracy: 0.9818 Epoch 3/5 938/938 [==============================] - 21s 22ms/step - loss: 0.0438 - accuracy: 0.9867 Epoch 4/5 938/938 [==============================] - 21s 22ms/step - loss: 0.0359 - accuracy: 0.9890 Epoch 5/5 938/938 [==============================] - 21s 22ms/step - loss: 0.0291 - accuracy: 0.9912 313/313 [==============================] - 2s 4ms/step - loss: 0.0322 - accuracy: 0.9887 Test accuracy: 0.9886999726295471 D:\深度学习>MNIST 数据集是一个大规模的手写数字图像数据集,是机器学习中最经典和最常用的数据集之一,特别是在图像分类任务和深度学习入门中经常被使用。
MNIST 数据集包含 60000 个训练样本和 10000 个测试样本,每个样本都是一幅 28 像素×28 像素的灰度图像,代表 0~9 的十个数字中的一个。每一幅图像都被标注了对应的真实数字。
在图像的每个像素中,数字 0 代表白色,数字 255 代表黑色,数字在这两者之间的表示不同的灰度级别。因此,一个图像可以表示为一个 28×28 的矩阵,矩阵中的每个元素都是一个 0~255 的整数。
在上面这个例子中,首先,从 Keras 的 datasets 模块中导入 MNIST 数据集。随后,将数据集的图像进行预处理,包括改变形状(使数据集适应模型的输入要求)以及归一化处理。最后,将标签转换为one-hot编码形式,以便进行多分类任务。
然后,创建一个 Sequential 模型,这是 Keras 中一种常见的线性模型结构。这个模型包含如下内容:
- 两个卷积层和两个最大池化层,用于特征的提取和降维;
- 一个展平层(Flatten),将卷积和池化后的 2D 数据展平为 1D;
- 一个全连接层(Dense),作为输出层,用于进行最后的分类。在全连接层中,用 softmax 激活函数生成每个类别的概率输出。
模型创建完成后,进行模型编译、设置优化器(这里用的是 Adam)、损失函数(这里用的是分类交叉熵损失)和评价指标(这里用的是准确率)。
接着,对模型进行训练,设置训练轮数(epochs)和每个批次的样本数量(batch_size)。
最后,用测试集对模型进行评估,打印出模型在测试集上的准确率。
卷积神经网络的设计和训练涉及许多技术和概念,包括卷积操作、ReLU 激活函数、过拟合、批量归一化、数据增强等。在实践中,通常需要结合对任务的理解和实验结果,确定如何使用网络结构及如何调整超参数。