文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

讲透一个强大的算法模型,CNN!!

2024-11-29 18:57

关注

卷积神经网络(CNN)是一种深度学习模型,主要用于处理具有网格结构(如图像)的数据。CNN 在计算机视觉领域表现尤为突出,广泛应用于图像分类、目标检测、图像生成等任务。

CNN 通过引入卷积层、池化层等特殊层,能够有效提取数据的局部特征,同时减少参数量,提升训练效率和模型的泛化能力。

CNN 的基本组成结构

一个典型的卷积神经网络通常由以下几个部分组成。

卷积层

卷积层是 CNN 的核心组件。它通过卷积操作来提取输入数据的局部特征。

卷积操作是将一个小的滤波器(filter)或者称为卷积核(kernel)在输入数据上滑动,进行逐元素的点积运算,从而生成一个特征图(feature map)。

图片

池化层

池化层的作用是减少特征图的尺寸,降低计算复杂度,同时保留重要特征。常见的池化操作包括最大池化(Max Pooling)和平均池化(Average Pooling)。

图片

全连接层

卷积层和池化层的输出(特征图)一般会展开成一个一维向量,并输入到全连接层。

全连接层类似于传统的前馈神经网络,每个节点与上一层的所有节点相连。

全连接层用于综合卷积层和池化层提取的特征并输出最终的分类结果。

图片

卷积神经网络的工作流程:

图片

  1. 输入层:输入图像数据。
  2. 卷积层:提取图像的局部特征,通过多个卷积层逐步提取更高层次的特征。
  3. 池化层:对特征图进行下采样,减少数据维度。
  4. 激活函数:引入非线性特性,使模型能够学习复杂的特征。
  5. 全连接层:将提取的特征整合并映射到分类空间。
  6. 输出层:通常使用 Softmax 函数进行多分类任务,输出每个类别的概率分布。

案例分享

以下是一个使用卷积神经网络(CNN)进行手写数字识别的示例代码,利用的是经典的 MNIST 数据集。

首先导入必要的 python 库。

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

然后加载和预处理数据。

# 加载 MNIST 数据集
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()

train_images = train_images.reshape((train_images.shape[0], 28, 28, 1)).astype('float32') / 255
test_images = test_images.reshape((test_images.shape[0], 28, 28, 1)).astype('float32') / 255

plt.figure(figsize=(8, 4))
for i in range(10):
    plt.subplot(2, 5, i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(train_images[i].reshape(28, 28), cmap=plt.cm.binary)
    plt.xlabel(train_labels[i])
plt.show()

图片

接下来,构建 CNN 模型

# 构建卷积神经网络模型
model = models.Sequential()

# 第一层卷积,32 个过滤器,大小为 3x3,激活函数为 ReLU,输入形状为 28x28x1
model.add(layers.Conv2D(32, (3, 3), activatinotallow='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))  # 最大池化层

# 第二层卷积,64 个过滤器,大小为 3x3
model.add(layers.Conv2D(64, (3, 3), activatinotallow='relu'))
model.add(layers.MaxPooling2D((2, 2)))

# 第三层卷积,64 个过滤器,大小为 3x3
model.add(layers.Conv2D(64, (3, 3), activatinotallow='relu'))

# 全连接层
model.add(layers.Flatten())  # 将卷积层的输出展开为一维向量
model.add(layers.Dense(64, activatinotallow='relu'))  # 全连接层
model.add(layers.Dense(10, activatinotallow='softmax'))  # 输出层,10 个分类,使用 softmax 激活

model.summary()

图片

然后,编译和训练模型:

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

history = model.fit(train_images, train_labels, epochs=5, 
                    validation_data=(test_images, test_labels))


# 绘制训练和验证损失曲线
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend(loc='upper right')
plt.show()

图片

最后,对测试集进行预测:

predictions = model.predict(test_images)
plt.figure(figsize=(8, 4))
for i in range(10):
    plt.subplot(2, 5, i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(test_images[i].reshape(28, 28), cmap=plt.cm.binary)
    plt.xlabel(f"True: {test_labels[i]}, Pred: {predictions[i].argmax()}")
plt.show()

图片


来源:程序员学长内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯