当前位置: 首页 > 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流,处理流:缓冲流、转换流、数据流、对象流

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

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

pam_env.so模块配置解析

在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...