终于把卷积神经网络算法搞懂了!!!

开发 前端
卷积神经网络算法(CNN)是一种专门用于处理网格状拓扑结构数据的深度学习算法,广泛应用于计算机视觉领域,在图像分类、目标检测和图像分割等任务中表现出色。

大家好,我是小寒

今天给大家分享一个强大的算法模型,卷积神经网络

卷积神经网络算法(CNN)是一种专门用于处理网格状拓扑结构数据的深度学习算法,广泛应用于计算机视觉领域,在图像分类、目标检测和图像分割等任务中表现出色。

CNN 的核心思想是通过模仿生物神经系统的视觉皮层结构,逐层提取数据的局部特征,从而实现高效的特征学习。CNN 相比于传统的全连接神经网络,具有较少的参数和更强的空间不变性。

图片图片

卷积神经网络的基本结构

CNN 主要由卷积层、池化层和全连接层构成,各部分共同协作从输入图像中提取特征,最后实现分类或回归任务。

卷积层

卷积层是 CNN 的核心组成部分,它的主要功能是通过卷积操作提取局部特征。

卷积操作是通过一个小的滤波器(或卷积核)在输入图像上滑动来计算的,每次滑动时,卷积核与局部区域的像素值做点积运算,并输出一个新的值。这些新值组成了特征图(feature map)。

图片图片

卷积核

卷积核(也称为滤波器)是一个小的权重矩阵(例如 3x3、5x5),它的参数(权重)是可学习的。

它通过在输入数据上滑动(卷积)来生成特征图。

步长

步长决定了卷积核在输入数据上滑动的步伐。

较大的步长会减少输出特征图的尺寸,反之,较小的步长会增加输出特征图的尺寸。

图片图片

填充(Padding)

填充是为了确保卷积操作不会丢失边缘信息,通常会在输入数据的边缘添加一些零值,称为零填充。

图片图片

卷积层的作用是通过不同的卷积核提取不同的特征,比如边缘、角点、纹理等。

卷积操作后的输出通常会通过一个非线性激活函数处理,以引入非线性,提升模型表达复杂特征的能力。

池化层

池化层通常位于卷积层之后,它通过下采样操作减小特征图的尺寸,减少计算量和参数数量,避免过拟合。

常见的池化操作有最大池化和平均池化

  • 最大池化(Max Pooling),对每个子区域选择最大值。
  • 平均池化(Average Pooling),对每个子区域取平均值。

图片图片

全连接层

全连接层通常位于网络的最后阶段,其主要作用是将卷积层和池化层提取的高维特征映射到标签空间,实现最终的分类任务。

全连接层中的每个神经元与前一层的所有神经元都有连接。

图片图片

卷积神经网络的工作流程

  1. 输入层
    输入层通常是一个多维矩阵(如彩色图像为一个3维矩阵:宽度 × 高度 × 通道数)。
  2. 卷积操作
    在卷积层中,滤波器(卷积核)在输入数据上滑动,提取局部特征。
  3. 激活函数
    卷积操作后通过激活函数(如ReLU)引入非线性,使模型能够学习到更复杂的特征。
  4. 池化层
    池化层通过下采样操作减少特征图的尺寸,减小计算复杂度并提取更具抽象性的特征。
  5. 全连接层
    全连接层将提取到的特征进行整合,并最终输出预测结果。
  6. 输出层
    最后一层通常使用 softmax 函数输出每个类别的概率,用于分类任务。

CNN的优点

  • 参数共享
    卷积层中权重共享的设计减少了网络参数数量,使得CNN在较少的计算资源下仍能保持较高的精度。
  • 自动特征提取
    通过逐层堆叠卷积层,CNN 可以自动从数据中提取特征,无需手工设计特征。
  • 空间不变性
    卷积操作对图像的平移、旋转、缩放具有一定的鲁棒性。

案例分享

下面是一个使用卷积神经网络(CNN)进行手写数字识别的示例代码。

import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt

# 加载 MNIST 数据集
(x_train, y_train), (x_test, y_test) = datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
x_train = x_train.reshape((x_train.shape[0], 28, 28, 1))
x_test = x_test.reshape((x_test.shape[0], 28, 28, 1))
y_train = tf.keras.utils.to_categorical(y_train, 10)
y_test = tf.keras.utils.to_categorical(y_test, 10)

# 构建 CNN 模型
model = models.Sequential([
    layers.Conv2D(32, (3, 3), activatinotallow='relu', input_shape=(28, 28, 1)),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activatinotallow='relu'),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activatinotallow='relu'),
    layers.Flatten(),
    layers.Dense(64, activatinotallow='relu'),
    layers.Dense(10, activatinotallow='softmax')  # 10 类输出
])

# 编译模型
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# 训练模型
model.fit(x_train, y_train, epochs=5, batch_size=64, validation_data=(x_test, y_test))

# 在测试集上评估模型
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"Test accuracy: {test_acc:.4f}")

# 随机选择一些测试图像的索引
num_images = 10
random_indices = np.random.choice(x_test.shape[0], num_images, replace=False)

test_images = x_test[random_indices]
true_labels = np.argmax(y_test[random_indices], axis=1)
predicted_labels = np.argmax(model.predict(test_images), axis=1)

plt.figure(figsize=(12, 4))
for i in range(num_images):
    plt.subplot(2, 5, i + 1)
    plt.imshow(test_images[i].reshape(28, 28), cmap='gray')
    plt.title(f"True: {true_labels[i]}\nPred: {predicted_labels[i]}")
    plt.axis('off')
plt.show()

图片图片

责任编辑:武晓燕 来源: 程序员学长
相关推荐

2024-09-20 07:36:12

2024-10-28 00:38:10

2024-10-05 23:00:35

2024-09-12 08:28:32

2024-10-17 13:05:35

神经网络算法机器学习深度学习

2024-12-12 00:29:03

2024-07-24 08:04:24

神经网络激活函数

2024-11-07 08:26:31

神经网络激活函数信号

2024-12-02 01:10:04

神经网络自然语言DNN

2024-09-26 07:39:46

2024-09-23 09:12:20

2024-10-16 07:58:48

2024-12-03 08:16:57

2024-07-17 09:32:19

2024-11-14 00:16:46

Seq2Seq算法RNN

2021-06-22 09:46:52

神经网络人工智能深度学习

2024-08-01 08:41:08

2024-10-08 10:16:22

2024-10-28 15:52:38

机器学习特征工程数据集

2024-10-30 08:23:07

点赞
收藏

51CTO技术栈公众号