当前位置: 首页 > news >正文

深度学习第3天:CNN卷积神经网络

☁️主页 Nowl

🔥专栏《机器学习实战》 《机器学习》

📑君子坐而论道,少年起而行之 

文章目录

介绍

CNN的主要结构

卷积层

激励层

池化层

Kears搭建CNN

搭建代码

直观感受卷积的作用

结语


介绍

卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,主要用于处理和识别具有网格结构的数据,如图像和视频。CNN在计算机视觉领域取得了巨大的成功,广泛应用于图像分类、目标检测、人脸识别等任务。


CNN的主要结构

CNN的主要结构其实就三个部分,卷积层,激励层,池化层,我们接下来主要介绍这三个部分

卷积层

卷积层中核心的东西叫做滤波器,他是一个有形状的矩阵,滤波器的作用是提取图片的特征,我们可以设置滤波器的数量,不同滤波器得到的图片包含图片的不同特征

这张图显示了一个滤波器的某时刻的运作过程,最左边的是原图,中间是滤波器,最右边是结果,它会进行一个内积运算,图中也展示了这个过程

我们可以这样思考,不同的滤波器与图片进行的内积结果不同,如果是一个提取轮廓的滤波器,我们可以理解原图中的轮廓特征经过滤波后会得到保留,而背景特征等信息就会逐渐消失

激励层

其实激励层不算一个层,它是作为卷积层的激活函数,它有以下几个优点

  1. 非线性变换: ReLU 引入了非线性变换,使得 CNN 能够学习更复杂的函数和特征。线性变换的叠加仍然是线性的,而引入非线性激活函数如 ReLU 可以打破这种线性性,使得网络更有能力逼近复杂的函数。

  2. 稀疏激活性: ReLU 对于正数的输入直接输出,而对于负数的输入则输出零。这种性质使得神经网络中的许多神经元变得非常稀疏,只有在输入为正数时才被激活。这有助于减少模型的参数数量,提高计算效率,并减轻过拟合的风险。

  3. 特征的稀疏性: ReLU 可以帮助网络更加稀疏地表示学到的特征。通过将负数的激活设为零,ReLU 有助于将不重要的特征过滤掉,保留对任务有贡献的特征。

  4. 解决梯度消失问题: 相较于一些传统的激活函数(如 sigmoid 和 tanh),ReLU 更容易处理梯度消失的问题。在反向传播过程中,ReLU 的梯度对于正数输入是常数,而对于负数输入是零,这有助于在深层网络中更好地传递梯度,避免梯度消失的问题。

池化层

池化层简而言之是用来降低特征图尺寸,保留重要特征的,提取区域就是池化层的大小,主要的池化层有两种,平均池化与最大池化

平均池化

顾名思义,平均池化就是取区域中的平均值

这幅图中池化层的大小是(2x2)

最大池化

最大池化就是取区域中的最大值

这幅图中池化层的大小也是(2x2)

Kears搭建CNN

搭建代码

以下是使用Keras搭建CNN的代码

# 导入必要的库
from keras.layers import Conv2D, MaxPooling2D
from keras.models import Sequential# 构建一个简单的卷积神经网络模型
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))

 先导入Keras中的库,接着构建神经网络,Conv2D构建了一个卷积层,有32个滤波器,每个滤波器的大小是(3,3),MaxPooling2D代表使用最大池化层,池化层大小为(2,2)

直观感受卷积的作用

在这一部分我们通过可视化来直观感受一下卷积神经网络的作用

1.图片导入与处理

# 加载一张彩色图像
image_path = "hou.jpg"
img = load_img(image_path, target_size=(224, 224))
img_array = img_to_array(img)
img_array = img_array / 255.0  # 归一化# 将图片扩展维度以符合模型的输入要求
img_array = np.expand_dims(img_array, axis=0)
  • 导入图片
  • 将图片格式转化为224x224
  • 获取图片矩阵
  • 归一化, 归一化不会改变原本的图像像素比例,目的是使模型训练过程中更容易收敛
  • 拓展维度以适应Keras模型的输入要求

2.构建网络

# 构建一个简单的卷积神经网络模型
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3), padding='same'))
model.add(MaxPooling2D((2, 2)))

我们这里就构建一层卷积层,池化层,正常任务中应该多一点,我们先仅了解卷积的作用 

3.可视化

# 创建一个新的模型,只包含卷积层部分
convolution_model = Model(inputs=model.input, outputs=model.layers[-1].output)# 获取卷积层的输出
conv_output = convolution_model.predict(img_array)print(conv_output.shape)# 可视化卷积层输出的多个特征图
for i in range(12):plt.subplot(4, 3, i+1)plt.imshow(conv_output[0, :, :, i], cmap='viridis')plt.axis('off')
plt.show()

经过卷积后,我们得到32张图片(有32个滤波器),我们展示前12张

得到以下图片

可以看到得到了图片的不同特征,边缘,纹理,光照,形状,轮廓等(经过多层卷积,这些特征会更加显著)

4.完整代码

这一部分我们搭建三层卷积层的完整代码,再看看效果

import numpy as np
from keras.models import Model
from keras.preprocessing.image import load_img, img_to_array
from keras.layers import Conv2D, MaxPooling2D
from keras.models import Sequential
import matplotlib.pyplot as plt# 构建一个简单的卷积神经网络模型
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))# 加载一张彩色图像
image_path = "hou.jpg"
img = load_img(image_path, target_size=(224, 224))
img_array = img_to_array(img)
img_array = img_array / 255.0  # 归一化# 将图片扩展维度以符合模型的输入要求
img_array = np.expand_dims(img_array, axis=0)# 创建一个新的模型,只包含卷积层部分
convolution_model = Model(inputs=model.input, outputs=model.layers[-1].output)# 获取卷积层的输出
conv_output = convolution_model.predict(img_array)print(conv_output.shape)# 可视化卷积层输出的多个特征图
for i in range(12):plt.subplot(4, 3, i+1)plt.imshow(conv_output[0, :, :, i], cmap='viridis')plt.axis('off')
plt.show()

可以看到不同的特征更加的显著(无关特征逐渐消失),这样模型能更好地学习到不同的特征,以进行图像识别等任务

结语

  • 卷积神经网络主要用来处理图像,视频等,因为它有提取特征的作用
  • 一般通过改变层的数量,滤波器个数,池化层形状等参数调整神经网络的性能

感谢阅读,觉得有用的话就订阅下本专栏吧

相关文章:

深度学习第3天:CNN卷积神经网络

☁️主页 Nowl 🔥专栏《机器学习实战》 《机器学习》 📑君子坐而论道,少年起而行之 ​ 文章目录 介绍 CNN的主要结构 卷积层 激励层 池化层 Kears搭建CNN 搭建代码 直观感受卷积的作用 结语 介绍 卷积神经网络(Convol…...

# Panda3d 碰撞检测系统介绍

Panda3d 碰撞检测系统介绍 文章目录 Panda3d 碰撞检测系统介绍碰撞几何体的介绍碰撞球体碰撞胶囊反碰撞球体碰撞平面碰撞多边形碰撞射线碰撞直线碰撞段碰撞抛物线碰撞长方体碰撞系统图碰撞处理器碰撞处理器队列碰撞处理器事件碰撞处理器回退模型(CollisionHandlerPusher)物理…...

leetcode面试经典150题——31 无重复字符的最长子串(方法二极简代码!!!)

题目: 无重复字符的最长子串 描述: 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 leetcode链接 方法…...

Kafka(一):在WSL单机搭建Kafka伪集群

目录 1 运行Kafka单实例1.1 Windws1.1.1 安装包下载1.1.2 修改环境变量1.1.3 修改配置文件1.1.4 启动Kafka单机版 1.2 Linux1.2.1 安装包下载1.2.2 创建目录1.2.3 添加环境变量1.2.4 修改配置文件1.2.5 运行Kafka1.2.6 停止Kafka 2 搭建Kafka集群2.1 搭建Zookeeper集群2.2 搭建…...

mysql1124实验七索引管理

实验任务七 索引管理实验任务书 1. 实验目的 掌握在MySQL中使用MySQL Workbench或者SQL语句创建和使用索引的方法(以SQL命令为重点)。 掌握在MySQL中使用MySQL Workbench或者SQL语句查看和删除索引的方法(以SQL命令为重点)。 …...

[带余除法寻找公共节点]二叉树

二叉树 题目描述 如上图所示,由正整数1, 2, 3, ...组成了一棵无限大的二叉树。从某一个结点到根结点(编号是1的结点)都有一条唯一的路径,比如从10到根结点的路径是(10, 5, 2, 1),从4到根结点的路径是(4, 2, 1)&#x…...

详解Rust编程中的生命周期

1.摘要 生命周期在Rust编程中是一个重要概念, 它能确保引用像预期的那样一直有效。在Rust语言中, 每一个引用都有其生命周期, 通俗讲就是每个引用在程序执行的过程中都有其自身的作用域, 一旦离开其作用域, 其生命周期也宣告结束, 值不再有效。幸运的是, 在绝大多数时间里, 生…...

【实践】Deployer 发布到search head : local OR default

1: 背景: search head deployer 上的 /opt/splunk/etc/schcluster/apps 下面的local, 还有default 派发到 search head 到app 下面是怎么工作的,这个过程,实践了一下: 参考Use the deployer to distribute apps and configuration updates - Splunk Documentation 2: 实…...

U盘报错无法访问文件或目录损坏且无法读取的解决办法

使用电脑打开U盘的部分文件时提示无法访问,文件或目录损坏且无法读取 报错内容如下图: 因为我这个U盘是那种双接口的 Type-C和USB,前段时间被我摔了一下 看网上说这种双接口的U盘USB接口容易坏掉 尝试在手机上使用OTG打开,先测试…...

【MySQL】数据库基础操作

👑专栏内容:MySQL⛪个人主页:子夜的星的主页💕座右铭:前路未远,步履不停 目录 一、数据库操作1、创建数据库2、查看所有数据库3、选定指定数据库4、删除数据库 二、数据表操作1、创建数据表2、查看所有表3、…...

2023年微软开源八个人工智能项目

自2001年软件巨头微软前首席执行官史蒂夫鲍尔默对开源(尤其是Linux)发表尖刻言论以来,微软正在开源方面取得了长足的进步。继ChatGPT于去年年底发布了后,微软的整个2023年,大多数技术都是面向开发人员和研究人员公开发…...

指定训练使用的GPU个数,没有指定定gpu id,训练在其中两个gpu上执行,但是线程id分布在所有4个gpu上,为什么?如何解决?

目录 问题背景 1 线程id分布在所有gpu(包括未启用的gpu)上原因: 2 在解决这个问题时,可以采取以下步骤: 3 修正深度学习框架默认使用所有可见 GPU 的问题 1 TensorFlow: 2 PyTorch: 3 K…...

PPT 遇到问题总结(修改页码统计)

PPT常见问题 1. 修改页码自动计数 1. 修改页码自动计数 点击 视图——>幻灯片母版——>下翻找到计数页直接修改——>关闭母版视图...

Matplotlib子图的创建_Python数据分析与可视化

Matplotlib子图的创建 plt.axes创建子图fig.add_axes()创建子图 plt.axes创建子图 前面已经介绍过plt.axes函数,这个函数默认配置是创建一个标准的坐标轴,填满整张图。 它还有一个可选的参数,由图形坐标系统的四个值构成。这四个值表示为坐…...

VM虚拟机中Ubuntu14.04安装VM tools后仍不能全屏显示

1、查看Ubuntu所支持的分辨率大小。 在终端处输入: xrandr,回车 2、输入你想设置的分辨率参数。 我设置的为1360x768,大家可以根据自己的具体设备设置。 在终端输入:xrandr -s 1360x768 注意:这里1360后边是字母 x 且…...

聊聊httpclient的connect

序 本文主要研究一下httpclient的connect HttpClientConnectionOperator org/apache/http/conn/HttpClientConnectionOperator.java public interface HttpClientConnectionOperator {void connect(ManagedHttpClientConnection conn,HttpHost host,InetSocketAddress loca…...

处理视频的新工具:UniFab 2.0.0.4 Crack

UniFab这是一个用于处理视频的新工具,可以帮助您像专业人士一样获得结果,事实上,它可以确保在项目的任何设备上完美播放,所以,来认识一下 UniFab - 一款功能强大且方便的视频编辑器和转换器,但另一方面&…...

设计模式—开闭原则

1.背景 伯特兰迈耶一般被认为是最早提出开闭原则这一术语的人,在他1988年发行的《面向对象软件构造》中给出。这一想法认为一旦完成,一个类的实现只应该因错误而修改,新的或者改变的特性应该通过新建不同的类实现。新建的类可以通过继承的方…...

【开源】基于Vue和SpringBoot的学校热点新闻推送系统

项目编号: S 047 ,文末获取源码。 \color{red}{项目编号:S047,文末获取源码。} 项目编号:S047,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 新闻类型模块2.2 新闻档案模块2.3 新…...

Java,File类与IO流,处理流:缓冲流、转换流、数据流、对象流

目录 处理流之一:缓冲流 四种缓冲流: 缓冲流的作用: 使用的方法: 处理文本文件的字符流: 处理非文本文件的字节流: 操作步骤: 处理流之二:转换流 转换流的使用: …...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异&#xff…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层&#xf…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...