深度学习之CNN卷积神经网络

一.卷积神经网络

1. 导入资源包

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import sklearn
import tensorflow as tf
from tensorflow import keras

:from tensorflow import keras:从TensorFlow库中导入Keras模块,它是TensorFlow的一个高级API,用于构建和训练神经网络。Keras提供了一个简洁的接口,使得构建复杂的神经网络变得更加容易。

2.数据导入与数据观察

from sklearn.datasets import load_sample_image

#由于图像的像素值通常在0255之间,这里将其缩放到[0, 1]的范围,以便于后续处理和可视化。
china = load_sample_image("china.jpg") / 255  
flower = load_sample_image("flower.jpg") / 255
plt.subplot(1,2,1)
plt.imshow(china)
plt.subplot(1,2,2)
plt.imshow(flower)

运行结果
在这里插入图片描述
:这段代码使用了Scikit-learn库来加载两个示例图像,并将它们调整为[0, 1]的灰度值范围,然后使用Matplotlib库将这两个图像分别显示在一个2x1的子图中。

2.1.打印出两个图像的维度

print("china.jpg的维度:",china.shape)
print("flower.jpg的维度:",flower.shape)

运行结果
在这里插入图片描述
:由于图像数据通常是一个NumPy数组,其形状表示为高度、宽度和通道数(如果图像有多个通道的话)。这里,china.shape将返回一个元组,表示图像的形状。

2.2.将两个图像数组组合成一个NumPy数组,并打印出形状。

images = np.array([china,flower])
images_shape = images.shape
print("数据集的维度:",images_shape)

运行结果
在这里插入图片描述
:images = np.array([china,flower]):这行代码将两个图像数组(china和flower)作为列表的元素,并使用NumPy的array函数将它们组合成一个多维数组。这个数组可能包含两个图像,每个图像是一个二维数组(高度 x 宽度)。

3.卷积层

u = 7 #卷积核的边长
s = 1 #滑动步长
p = 5 #输入特征图数目

conv = keras.layers.Conv2D(filters = p, kernel_size = u, strides = s,
                          padding = "SAME", activation="relu", input_shape=images_shape)

image_after_conv = conv(images)
print("卷积后的张量大小:", image_after_conv.shape)

#activation = "relu":指定激活函数为ReLU

运行结果
在这里插入图片描述
:这段代码定义了一个二维卷积层(Conv2D),并将这个卷积层应用于一个名为images的NumPy数组。代码中的参数u、s和p分别表示卷积核的边长、滑动步长和输入特征图的数量。

4.汇聚层

4.1.最大汇聚

pool_max = keras.layers.MaxPool2D(pool_size=2)
#这行代码将image_after_conv张量作为输入传递给最大汇聚层pool_max,并计算汇聚操作后的输出。
image_after_pool_max = pool_max(image_after_conv)
print("最大汇聚后的张量大小:",image_after_pool_max.shape)

运行结果
在这里插入图片描述
:这段代码定义了一个最大汇聚层(MaxPool2D),并将这个汇聚层应用于之前通过卷积层(Conv2D)处理过的图像张量(image_after_conv)。代码中的参数pool_size定义了汇聚操作的窗口大小。

4.2.平均汇聚

pool_avg = keras.layers.AvgPool2D(pool_size=2)
image_after_pool_avg = pool_avg(image_after_conv)
print("平均汇聚后的张量大小:",image_after_pool_avg.shape)

运行结果
在这里插入图片描述
:平均汇聚层通常用于减少特征图的大小,同时保留重要信息。通过将窗口内的值进行平均,平均汇聚层可以捕捉到图像中的关键特征。汇聚操作后,输出特征图的尺寸会减小,但每个元素都是通过计算窗口内所有元素的平均值得到的,因此保留了更多的上下文信息。

4.3.全局平均汇聚

pool_global_avg = keras.layers.GlobalAvgPool2D()
image_after_pool_global_avg = pool_global_avg(image_after_conv)
print("全局平均汇聚后的张量大小:",image_after_pool_global_avg.shape)

运行结果
在这里插入图片描述
:这段代码定义了一个全局平均汇聚层(GlobalAvgPool2D),并将这个汇聚层应用于之前通过卷积层(Conv2D)处理过的图像张量(image_after_conv)。全局平均汇聚层会在整个输入特征图上执行平均汇聚操作,这意味着它会将输入特征图的每个元素都除以特征图的总元素数,以计算每个特征的平均值。

5.搭建卷积神经网络进行手写数字识别

5.1.导入并对数据进行预处理

train_Data = pd.read_csv('mnist_train.csv',header = None) #训练数据
test_Data = pd.read_csv('mnist_test.csv',header = None)  #测试数据

X, y = train_Data.iloc[:,1:].values/255, train_Data.iloc[:,0].values #数据归一化

X_valid, X_train = X[:5000].reshape(5000,28,28) , X[5000:].reshape(55000,28,28) #验证集与训练集
y_valid, y_train = y[:5000], y[5000:]

X_test,y_test = test_Data.iloc[:,1:].values.reshape(10000,28,28)/255, test_Data.iloc[:,0].values #测试集
print(X_train.shape)
print(X_valid.shape)
print(X_test.shape)

运行结果
在这里插入图片描述
:这段代码的输出将显示各个数据集的形状,即它们的样本数量和每个样本的特征维度。对于MNIST数据集,每个样本是一个28x28的图像,因此每个样本有784个特征(28*28)。

5.2.扩张为四维张量

X_train = X_train[..., np.newaxis]
X_valid = X_valid[...,np.newaxis]
X_test = X_test[...,np.newaxis]

print(X_train.shape)
print(X_valid.shape)
print(X_test.shape)

运行结果
在这里插入图片描述
:将这些数据集的形状从(样本数量, 高度, 宽度)扩展为(样本数量, 高度, 宽度, 通道数)。这是为了匹配卷积神经网络(CNN)的输入要求,其中通道数通常是1(对于灰度图像)或3(对于RGB彩色图像)。

5.3.搭建卷积神经网络

#搭建模型
model_cnn_mnist = keras.models.Sequential([
    keras.layers.Conv2D(32, kernel_size=3, padding="same", activation="relu"),
    keras.layers.Conv2D(64, kernel_size=3, padding="same", activation="relu"),
    keras.layers.MaxPool2D(pool_size=2),
    keras.layers.Flatten(),
    keras.layers.Dropout(0.25),
    keras.layers.Dense(128, activation="relu"),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(10, activation="softmax")
])

#评估性能
model_cnn_mnist.compile(loss="sparse_categorical_crossentropy",optimizer="nadam",metrics=["accuracy"])
model_cnn_mnist.fit(X_train, y_train, epochs=10, validation_data=(X_valid, y_valid))

运行结果
在这里插入图片描述

第一层卷积层:使用32个大小的卷积核
第二层卷积层:使用64个大小的卷积核
第三层汇聚层:将所有特征映射的维度缩小至原先一半
第四层是平展层:将原先四维张量(55000,14,14,64)平展成两维张量(55000,),即将一个样本的所有参数项平展成一个维度
后续是全连接层

model_cnn_mnist.evaluate(X_test, y_test, batch_size=1)

运行结果
在这里插入图片描述
:使用model_cnn_mnist.evaluate方法来评估您的卷积神经网络(CNN)模型在MNIST测试集上的性能。这个方法将计算模型在测试数据上的损失和指标,这里是准确率。

model_cnn_mnist.summary()

运行结果
在这里插入图片描述
:打印出模型的结构

6.利用函数式API与子类API搭建复杂神经网络

6.1.残差层

class ResidualUnit(keras.layers.Layer):
    def __init__(self, filters, strides=1, activation="relu"):
        super().__init__()
        self.activation = keras.activations.get(activation)
        
        self.main_layers = [
            keras.layers.Conv2D(filters, 3, strides=strides, padding = "SAME", use_bias = False), 
            keras.layers.BatchNormalization(),
            self.activation,
            keras.layers.Conv2D(filters, 3, strides=1, padding = "SAME", use_bias = False),
            keras.layers.BatchNormalization()]
        
        # 当滑动步长s = 1时,残差连接直接将输入与卷积结果相加,skip_layers为空,即实线连接
        self.skip_layers = [] 
        
        # 当滑动步长s = 2时,残差连接无法直接将输入与卷积结果相加,需要对输入进行卷积处理,即虚线连接
        if strides > 1:
            self.skip_layers = [
                keras.layers.Conv2D(filters, 1, strides=strides, padding = "SAME", use_bias = False),
                keras.layers.BatchNormalization()]

    def call(self, inputs):
        Z = inputs
        for layer in self.main_layers:
            Z = layer(Z)
        skip_Z = inputs
        for layer in self.skip_layers:
            skip_Z = layer(skip_Z)
        return self.activation(Z + skip_Z)

:定义了一个名为ResidualUnit的类,它继承自keras.layers.Layer,用于创建残差单元(Residual Unit),这是深度学习中常用的一种网络结构,特别是在残差网络(ResNet)中。残差单元允许网络在深层中传播信息,通过跳跃连接(skip connections)来缓解梯度消失问题,从而使网络能够成功训练更深的层次。

6.2.搭建完整的ResNet-34神经网络

model = keras.models.Sequential()

model.add(keras.layers.Conv2D(64, 7, strides=2, padding = "SAME", use_bias = False))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Activation("relu"))
model.add(keras.layers.MaxPool2D(pool_size=3, strides=2, padding="SAME"))

prev_filters = 64
for filters in [64] * 3 + [128] * 4 + [256] * 6 + [512] * 3:
    strides = 1 if filters == prev_filters else 2   #在每次特征图数目扩展时,设置滑动步长为2
    model.add(ResidualUnit(filters, strides=strides))
    prev_filters = filters
    
model.add(keras.layers.GlobalAvgPool2D())
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(10, activation="softmax"))

model.compile(loss="sparse_categorical_crossentropy",optimizer="sgd",metrics=["accuracy"])
model.fit(X_train, y_train, epochs=10, validation_data=(X_valid, y_valid))

model.evaluate(X_test, y_test, batch_size=1)

运行结果
在这里插入图片描述
:使用了一个循环来添加多个残差单元。残差单元的数量和过滤器数量根据您提供的列表 [64] * 3 + [128] * 4 + [256] * 6 + [512] * 3 来确定。在每次特征图数目扩展时,即从64到128,从128到256,从256到512时,您将步长设置为2,以便在空间维度上进行下采样。

二.总结:前馈神经网络与卷积神经网络的区别

1.结构差异:

前馈神经网络:由输入层、一个或多个隐藏层以及输出层组成,每层之间的神经元完全连接。前馈网络通常用于处理非空间数据,如图像的像素值在输入时会被展平成一维向量。
卷积神经网络:由输入层、一个或多个卷积层、池化层、全连接层以及输出层组成。卷积层和池化层允许网络在处理数据时保留空间结构,因此非常适合处理图像和视频数据。

2.参数效率:

前馈神经网络:由于每层神经元之间的完全连接,前馈网络通常具有大量的参数,这使得网络在训练时更容易过拟合,尤其是在训练数据量有限的情况下。
卷积神经网络:通过权值共享和局部连接,卷积网络大大减少了参数的数量,这使得网络更加高效,并且能够在有限的数据上训练出更好的模型。

3.局部连接:

前馈神经网络:每一层的所有神经元都与上一层的所有神经元相连接。
卷积神经网络:卷积层中的神经元只与输入数据的一个局部区域连接,这反映了图像的局部性质。

4.平移不变性:

前馈神经网络:不具备平移不变性,即对输入数据的平移会改变网络的输出。
卷积神经网络:由于卷积操作的性质,卷积网络具有平移不变性,这意味着即使图像在空间上发生了平移,网络仍然能够识别出相同的模式。

5.池化操作:

前馈神经网络:不包含池化层,因此不会减少数据的空间维度。
卷积神经网络:通过池化层减少数据的维度,同时保留最重要的信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/658169.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第十三届蓝桥杯国赛大学B组填空题(c++)

A.2022 动态规划 AC; #include<iostream> #define int long long using namespace std; int dp[2050][15]; //dp[i][j]:把数字i分解为j个不同的数的方法数 signed main(){dp[0][0]1;for(int i1;i<2022;i){for(int j1;j<10;j){//一种是已经分成j个数,这时只需每一个…

Docker 快速更改容器的重启策略(Restart Policies)以及重启策略详解

目录 1. 使用 docker update 命令2. 在启动容器时指定重启策略3. 在 Docker Compose 文件中指定重启策略4. 总结 官方文档&#xff1a;Start containers automatically 1. 使用 docker update 命令 Docker 提供了 docker update 命令&#xff0c;可以在容器运行时更改其重启策…

Yann LeCun 和 Elon Musk 就 AI 监管激烈交锋

&#x1f989; AI新闻 &#x1f680; Yann LeCun 和 Elon Musk 就 AI 监管激烈交锋 摘要&#xff1a;昨天&#xff0c;Yann LeCun 和Elon Musk 在社交媒体就人工智能的安全性和监管问题展开激烈辩论。LeCun 认为目前对 AI 的担忧和监管为时过早&#xff0c;主张开放和共享。而…

OrangePi AIpro初体验:开启嵌入式开发之旅

概述 随着物联网和智能设备时代的到来&#xff0c;单板电脑因其独特的优势成为创新项目和教育实践的重要工具。在众多单板电脑中&#xff0c;香橙派以其出色的性能和亲民的价格&#xff0c;十分吸引博主这初涉嵌入式开发的新手。博主有幸被CSDN邀请对OrangePi AIpro进行测评。…

css中实现背景方格

background: rgba(241,241,241,0.1); background-image:linear-gradient(90deg, rgba(241,243,244,1) 10%, transparent 0),linear-gradient(rgba()241,243,244,1 10%, transparent 0); background-size: 10px 10px; 表现出来的样子就是这个样子

广东海上丝绸之路文化促进会正式批复荐世界酒中国菜的指导单位

广东海上丝绸之路文化促进会正式批复成为“世界酒中国菜”系列活动指导单位 近日&#xff0c;广东海上丝绸之路文化促进会近日正式批复荐酒师国际认证&#xff08;广州&#xff09;有限公司&#xff0c;成为备受瞩目的“世界酒中国菜”系列活动的指导单位。此举旨在通过双方的…

Android Compose 八:常用组件 Switch

Switch 切换按钮 val isChecked remember { mutableStateOf(true) }Switch(checked isChecked.value,onCheckedChange {Log.i("text_compose","onCheckedChange>>"it)isChecked.value it})效果 默认颜色 应该对应 主题色 1.1 thumbContent 按钮…

盘点好用的国产传输软件,看看哪个适合你

流动让数据释放价值&#xff0c;无论什么企业&#xff0c;什么行业&#xff0c;业务的正常开展均是以数据和文件的传输为基础&#xff0c;因此&#xff0c;对企业来说&#xff0c;文件传输工具是最基础但也是最举重若轻的。在琳琅满目的多种国产传输软件中&#xff0c;哪个是最…

Java基础:基本语法(一)

Java基础&#xff1a;基本语法&#xff08;一&#xff09; 文章目录 Java基础&#xff1a;基本语法&#xff08;一&#xff09;1. 前言2. 开发环境搭建2.1 Java开发工具包下载2.2 环境变量配置2.3 Java程序的运行过程 3. 数据类型3.1 基本数据类型3.2 引用数据类型 4. 常量与变…

晓语台:基于大语言模型和深度学习技术的智能创作平台,高效、个性化地创作高质量内容。

晓语台 AI&#xff1a; 晓语台是由北京字里心间科技有限公司推出的一款智能AI写作工具。它基于百度的大语言模型和混合大模型以及AIGC技术研发而成&#xff0c;内置了多种风格和主题的AI创作模板&#xff0c;覆盖了20余类行业与职业&#xff0c;近30个海内外社交平台&#xff…

代码随想录——合并二叉树(Leetcode617)

题目链接 层序遍历 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) …

20240529代码沉思--------聊聊清单革命

以下内容取自百度&#xff1a; 清单革命 清单革命是一场观念革命&#xff0c;旨在通过列出清晰、明确的清单来避免犯错和提高效率。以下是关于清单革命的一些核心观点和原则&#xff1a; 核心观点&#xff1a; 人类的错误主要分为两类&#xff1a;“无知之错”和“无能之错…

java配置文件解析yml/xml/properties文件

XML 以mybatis.xml:获取所有Environment中的数据库并连接session为例 import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException;import javax.xml.parsers.DocumentBuilder; impo…

【软件设计师】网络与多媒体基础知识

1.多媒体网络 JPEG累进&#xff08;或增量、渐进、递增&#xff09;编码模式&#xff0c;实现图像内容的方式传输&#xff0c;在浏览器上的直观效果就是无需过久等待即可看到模糊图像&#xff0c;然后图像显示和内容由模糊逐渐变得清晰 GIF图像文件格式以数据块为单位来存储图像…

前端路由 Hash 模式和 History 模式

在SPA单页面模式盛行&#xff0c;前后端分离的背景下&#xff0c;我们要弄清楚路由到底是个什么玩意&#xff0c;它可以帮助我们加深对于前端项目线上运作的理解。 而现在我们常见的路由实现方式&#xff0c;主要有两种&#xff0c;分别是history和hash模式。 理解 如何理解路…

uart_tty_驱动程序框架

UART子系统(四) TTY驱动程序框架_tty驱动框架-CSDN博客

【网络层】ICMP 因特网控制协议

文章目录 ICMP 含义以及作用ICMP协议解析结合ICMP协议和ping常见问题 ICMP 含义以及作用 ICMP&#xff1a;Internet control massage protocol 因特网控制协议 Internet控制报文协议ICMP是网络层的一个重要协议。 ICMP协议用来在网络设备间传递各种差错和控制信息&#xff0c;…

【优选算法】分治 {三分快排:三指针优化,随机选key,快速选择算法;归并排序:统计数组中的逆序对,统计数组中的翻转对;相关编程题解析}

一、经验总结 1.1 三分快排 优化一&#xff1a;三指针优化 之前学习的快速排序无法妥善处理相等或重复序列的排序问题&#xff08;有序且三数取中无效&#xff09;&#xff0c;使快速排序的效率无法达到最优。 为了解决重复序列的问题&#xff0c;我们将原先的双指针法&…

java项目之智能家居系统源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的智能家居系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于Springboot的智能家居系…

Redis:redis基础

Redis Remote Dictionary Service即远程字典服务 一个基于内存的key-value结构数据库,在开发中常常作为缓存存储不经常被改变的数据 基于内存存储,读写性能高 在企业中应用广泛 Redis介绍 用C语言开发的开源高性能键值对数据库,可以达到10w的qps,可以存储丰富的value类型…