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

深度学习blog-卷积神经网络(CNN)

卷积神经网络(Convolutional Neural Network,CNN)是一种广泛应用于计算机视觉领域,如图像分类、目标检测和图像分割等任务中的深度学习模型。

1. 结构
卷积神经网络一般由以下几个主要层组成:
输入层:接收原始图像数据,通常是三维(高、宽、通道)的张量。
卷积层(Convolutional Layer):使用多个卷积核(滤波器)对输入数据进行卷积操作,提取特征。该层的输出是特征图,显示了输入数据中的特征。卷积层是 CNN 的核心组成部分,它的主要功能是通过卷积操作提取局部特征。
在这里插入图片描述

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

步长指定卷积核在输入数据上滑动的步伐。
填充(Padding)
填充是为了确保卷积操作不会丢失边缘信息,通常会在输入数据的边缘添加一些零值,称为零填充。
激活层(Activation Layer):常用的激活函数包括ReLU(修正线性单元)等,负责引入非线性因素,提高网络学习能力。通常放在卷积层之后。
池化层(Pooling Layer):对特征图进行下采样,通常使用最大池化或平均池化,减少特征的尺寸,降低计算复杂度,同时保留重要特征。避免过拟合。
常见的池化操作有最大池化和平均池化
最大池化(Max Pooling),对每个子区域选择最大值。
平均池化(Average Pooling),对每个子区域取平均值。

全连接层(Fully Connected Layer):将高层次的特征输出转换为最终的分类结果。每个神经元与前一层的所有神经元相连接。(将提取的高维特征映射到标签空间)

输出层:提供最终的预测结果,比如分类标签或回归值。

  1. 原理
    卷积神经网络的核心原理是利用卷积操作进行特征提取。卷积层通过卷积核在输入图像上滑动,不断提取局部区域的特征,能够自动学习并优化这些特征。
    卷积操作:通过卷积核与输入图像的局部区域进行点积,生成特征图。这个过程能够捕捉图像中的边缘、角点等基础特征。
    参数共享:同一个卷积核在整个图像上重复使用,可以减少模型参数,提高模型的泛化能力。
    局部感知:卷积核的大小限制了每个神经元的感知范围,使网络能学习到局部特征。

  2. 工作流程
    卷积神经网络的工作流程通常包括以下几个步骤:
    图像输入:将图像数据输入到网络中。
    特征提取:
    在卷积层中,通过多个卷积核对输入图像进行卷积,生成特征图。
    通过激活函数引入非线性。
    使用池化层进行特征降维。
    分类阶段:
    将经过多层特征提取后的特征图展平成一维向量,输入到全连接层。
    使用激活函数进行处理。
    损失计算:通过损失函数计算预测值与真实值之间的误差。
    反向传播:通过反向传播算法更新网络中的权重和偏置,以最小化损失。
    预测输出:经过最后的输出层,网络给出分类结果或回归输出。

例子,识别手写数字:

import numpy as np
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), activation='relu', input_shape=(28, 28, 1)),layers.MaxPooling2D((2, 2)),layers.Conv2D(64, (3, 3), activation='relu'),layers.MaxPooling2D((2, 2)),layers.Conv2D(64, (3, 3), activation='relu'),layers.Flatten(),layers.Dense(64, activation='relu'),layers.Dropout(0.15),layers.Dense(10, activation='softmax')  # 10 类输出
])# 编译模型
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])# 训练模型
history = 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()# 绘制训练过程中的准确率和损失
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.legend()
plt.title('Training and Validation Accuracy')

在这里插入图片描述
pytorch实现:

import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
from torchvision import datasets# 加载 MNIST 数据集
transform = transforms.Compose([transforms.ToTensor(),  # 转换为 tensor,并归一化为 [0, 1] 区间
])
train_dataset = datasets.MNIST(root='../../data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST(root='../../data', train=False, download=True, transform=transform)# 数据加载器
train_loader = DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=64, shuffle=False)# 构建 CNN 模型
class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1)  # 28x28x1 -> 28x28x32self.pool = nn.MaxPool2d(kernel_size=2, stride=2)  # 下采样self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1)  # 28x28x32 -> 28x28x64self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1)  # 28x28x64 -> 28x28x64self.fc1 = nn.Linear(64 * 7 * 7, 64)  # 根据池化后特征的形状计算输入大小self.dropout = nn.Dropout(0.15)  # Dropout 层self.fc2 = nn.Linear(64, 10)  # 输出10类def forward(self, x):x = self.pool(torch.relu(self.conv1(x)))  # Conv1 + ReLU + Poolingx = self.pool(torch.relu(self.conv2(x)))  # Conv2 + ReLU + Poolingx = torch.relu(self.conv3(x))               # Conv3 + ReLUx = x.view(-1, 64 * 7 * 7)  # 展平x = torch.relu(self.fc1(x))  # FC1 + ReLUx = self.dropout(x)           # Dropoutx = self.fc2(x)               # FC2return x# 创建模型实例
model = CNN()# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters())# 训练模型
num_epochs = 5
for epoch in range(num_epochs):model.train()for batch_images, batch_labels in train_loader:optimizer.zero_grad()  # 梯度清零outputs = model(batch_images)  # 前向传播loss = criterion(outputs, batch_labels)  # 计算损失loss.backward()  # 反向传播optimizer.step()  # 更新参数print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')# 在测试集上评估模型
model.eval()
test_loss = 0
correct = 0
with torch.no_grad():for batch_images, batch_labels in test_loader:outputs = model(batch_images)  # 前向传播loss = criterion(outputs, batch_labels)  # 计算损失test_loss += loss.item()  # 累加损失_, predicted = torch.max(outputs.data, 1)  # 预测correct += (predicted == batch_labels).sum().item()  # 统计正确样本数# 计算准确率
test_accuracy = correct / len(test_dataset)
print(f"Test accuracy: {test_accuracy:.4f}")# 随机选择一些测试图像的索引并可视化
num_images = 10
random_indices = np.random.choice(len(test_dataset), num_images, replace=False)test_images = []
true_labels = []
predicted_labels = []for idx in random_indices:img, label = test_dataset[idx]test_images.append(img)true_labels.append(label)test_images_tensor = torch.stack(test_images)
with torch.no_grad():outputs = model(test_images_tensor)  # 前向传播_, predicted = torch.max(outputs.data, 1)  # 预测predicted_labels = predicted.numpy()# 可视化结果
plt.figure(figsize=(12, 4))
for i in range(num_images):plt.subplot(2, 5, i + 1)plt.imshow(test_images[i].numpy()[0], cmap='gray')  # 仅显示通道1plt.title(f"True: {true_labels[i]}\nPred: {predicted_labels[i]}")plt.axis('off')
plt.show()

在这里插入图片描述

相关文章:

深度学习blog-卷积神经网络(CNN)

卷积神经网络(Convolutional Neural Network,CNN)是一种广泛应用于计算机视觉领域,如图像分类、目标检测和图像分割等任务中的深度学习模型。 1. 结构 卷积神经网络一般由以下几个主要层组成: 输入层:接收…...

深度学习中的残差网络、加权残差连接(WRC)与跨阶段部分连接(CSP)详解

随着深度学习技术的不断发展,神经网络架构变得越来越复杂,而这些复杂网络在训练时常常遇到梯度消失、梯度爆炸以及计算效率低等问题。为了克服这些问题,研究者们提出了多种网络架构,包括 残差网络(ResNet)、…...

在Nginx部署Web应用,如何保障后端API的安全

1. 使用HTTPS和http2.0 参考:Nginx配置HTTP2.0_nginx 支持 2.0-CSDN博客 2. 设置严格的CORS策略 通过add_header指令设置CORS头。 只允许来自https://frontend.yourdomain.com的请求访问API location /api/ {if ($http_origin ~* (https://frontend\.yourdomai…...

arm架构 uos操作系统离线安装k8s

目录 操作系统信息 安装文件准备 主机准备 主机配置 配置hosts(所有节点) 关闭防火墙、selinux、swap、dnsmasq(所有节点) 系统参数设置(所有节点) 配置ipvs功能(所有节点) 安装docker(所有节点) 卸载老版本 安装docke…...

OpenCV-Python实战(1)——图像or视频文件处理

1、安装依赖库 pip install opencv-python # 主模块包pip install opencv-contrib-python # 主模块附加模块pip install numpy # numpy 库 2、图像的读取、显示、保存 读取:cv2.imread() img cv2.imread(path, flag) img: cv2.imread()函数返回值&#x…...

Flink SQL Cookbook on Zeppelin 部署使用

简介:对于初学者来说,学习 Flink 可能不是一件容易的事情。看文档是一种学习,更重要的是实践起来。但对于一个初学者来说要把一个 Flink SQL 跑起来还真不容易,要搭各种环境,真心累。很幸运的是,Flink 生态…...

【hackmyvm】DC04靶机wp

created: 2024-12-04 23:08 tags: HMV黄金票据PTTntlm中毒 难度: ⭐️⭐️⭐️⭐️⭐️ 作者: josemlwdf 系统: Windows 1. 基本信息^toc 文章目录 1. 基本信息^toc2. 信息收集2.1. 端口扫描2.2. 目录扫描2.3. 网址利用 3. websvc用户3.1. NTLM中毒攻击3.2. smb探测 4. rtina9…...

记录jvm进程号

日常开发中,相信大家会经常用到这么一行命令: ps -ef | grep xxx.jar | grep -v grep | awk {print $2} | xargs -r kill -9 就是杀掉xxx相关的进程,然后启动,当然也还有其他的方式可以实现类似的功能,我就不列举了&…...

day19——web自动化测试(1)

【没有所谓的运气🍬,只有绝对的努力✊】 目录 1、什么是自动化 1.1 概念: 1.2 优点: 2、什么是自动化测试 2.1 自动化测试能解决什么问题? 2.1.1 优点: 2.1.2 误区: 2.2 自动化测试分类…...

go window安装protoc protoc生成protobuf文件

1. 下载: Releases protocolbuffers/protobuf GitHub 2. 解压缩: 3. 配置环境变量: 选择系统变量->Path -> 新增 解压缩后的bin路径 4. 打印版本: protoc --version 5. 安装protoc-gen-go cmd 下输入安装命令&#xff0…...

微信小程序中momentjs无法切换中文问题处理

微信小程序中momentj.s无法切换中文问题处理. 表现为 使用 locale(“zh-cn”)无效。 处理方法 # 1、先删除 miniprogram_npm\moment\index.js # 2、将 node_modules\moment\min\moment-with-locales.min.js 复制到 miniprogram_npm\moment下 并重命名为index.js # 3、修改mi…...

数据结构:链表

链表是一种常见的数据结构,它由一系列节点(Node)组成,每个节点包含两个部分:数据域和指针域。数据域用于存储数据元素的值,而指针域则用于指向链表中的下一个节点。这种结构使得链表能够动态地进行插入和删…...

领克Z20结合AI技术,革新自动驾驶辅助系统

眼瞅着,再有不到 5 个星期,春节就要热热闹闹地登场啦!对于在外辛苦打拼了一整年的打工人而言,回家过年可不就是这一年里心心念念、最最期盼的高光时刻嘛。这不,这几天各地的高速公路愈发熙熙攘攘起来,川流不…...

vector快慢指针+例题详解

1.快慢指针 例题 给定一个链表,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从…...

重温设计模式--1、组合模式

文章目录 1 、组合模式(Composite Pattern)概述2. 组合模式的结构3. C 代码示例4. C示例代码25 .应用场景 1 、组合模式(Composite Pattern)概述 定义:组合模式是一种结构型设计模式,它允许你将对象组合成…...

单片机:实现SYN6288语音播报(附带源码)

单片机实现SYN6288语音播报 SYN6288是一款广泛应用于语音合成的IC,可以通过串口与单片机(如51系列、STM32等)进行通信,实现场景化的语音播报。通过连接外部存储设备(如SD卡)存储语音文件或直接通过内部语音…...

cookie,session,token 的区别

解决什么问题?Cookie(客户端存储)问题来了 Session(会话)解决的问题问题来了 token(令牌)解决的问题问题:token是无状态的如何解决? 解决什么问题? 解决http无状态的问题,说简单点就是用户身份的验证 举个例子: 张三在银行里…...

基于OpenAI Whisper AI模型自动生成视频字幕:全面解析与实战指南

在数字化时代,视频内容已成为信息传播的重要载体。然而,为视频添加字幕却是一项繁琐且耗时的工作。幸运的是,随着人工智能技术的飞速发展,特别是OpenAI Whisper模型的推出,我们有了更加高效、智能的解决方案。 一、Op…...

物理学天空的两朵乌云——量子论与相对论

物理学天空的两朵乌云——量子论与相对论 爱因斯坦的青春与科学的辉煌起点 提到爱因斯坦,我们往往会联想到一个经典的形象——乱糟糟的头发,叼着烟斗,脸上满是岁月的皱纹。然而,这张深入人心的照片并不是他科学创造力的象征。实…...

聚类之轮廓系数

Silhouette Score(轮廓系数)是用于评估聚类质量的指标之一。它衡量了数据点与同簇内其他点的相似度以及与最近簇的相似度之间的对比。 公式 对于一个数据点 i: a(i): 数据点 i 到同簇内其他点的平均距离(簇内不相似度&#xff…...

Vue3集成百度地图GL版:从自定义样式到动态轨迹绘制实战

1. Vue3集成百度地图GL版的前期准备 第一次在Vue3项目里用百度地图GL版时,我踩了不少坑。这里分享下最稳妥的集成方案,帮你避开那些我趟过的雷。首先得明白,百度地图GL版是基于WebGL技术的新一代地图API,相比传统版本性能更好、效…...

大模型训练实战:分布式训练、显存优化与知识蒸馏全解析!

全景路线图: 我们将按模块逐步展开,每个模块都是最终搭建完整平台的一块拼图:之前的章节参考我之前写的文章;G. 分布式训练篇:大模型训练的工程实践 – 学习在多卡多机环境下训练大模型的方法,包括数据并行…...

手把手教你用逻辑分析仪抓取并解析MIPI-CSI-2数据包(以RAW10格式为例)

手把手教你用逻辑分析仪抓取并解析MIPI-CSI-2数据包(以RAW10格式为例) 在嵌入式视觉系统的开发中,MIPI-CSI-2协议的数据流就像是一条暗河——虽然知道它的存在,但水面下的实际传输细节往往难以窥见。当摄像头输出的图像出现断层、…...

双向链表添加节点实现分析

链表节点结构class Node {private Object obj;private Node pre;private Node next;public Node(Object obj, Node pre, Node next) {this.obj obj;this.pre pre;this.next next;} }节点包含三个字段:存储数据的obj,指向前驱节点的pre,指向…...

在Ubuntu里同时安装mozc和sogoupinyin输入法的后续故事

好久没有玩Ubuntu了。最近小龙虾真的是如火如荼的,想凑个热闹,就把16年的电脑革掉,安装上了Ubuntu 22.04.5 LTS。安装完了才想起来,我这台老电脑压根就没有独显,电脑自己的本地龙虾,是铁定装不上了。龙虾的…...

基于深度学习的轴承故障诊断:CNN-LSTM架构演进与核心代码逻辑拆解

基于深度学习的轴承故障诊断:CNN-LSTM架构演进与核心代码逻辑拆解前言 在设备健康管理(PHM)的实战中,面对凯斯西储大学(CWRU)轴承数据集,直接将几十万个采样点的振动信号塞给模型是行不通的。即…...

SuperDuperDB事件驱动架构:构建实时AI应用的全新方式

SuperDuperDB事件驱动架构:构建实时AI应用的全新方式 【免费下载链接】superduperdb Superduper: End-to-end framework for building custom AI applications and agents. 项目地址: https://gitcode.com/gh_mirrors/su/superduperdb SuperDuperDB是一个端到…...

三步打造完美Jellyfin番剧库:Bangumi插件实战指南

三步打造完美Jellyfin番剧库:Bangumi插件实战指南 【免费下载链接】jellyfin-plugin-bangumi bgm.tv plugin for jellyfin 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-bangumi 你是否曾为Jellyfin中的动漫收藏而烦恼?看着那些…...

为什么ITK在医学影像分析中如此强大?深入解析其Pipeline设计原理

为什么ITK在医学影像分析中如此强大?深入解析其Pipeline设计原理 医学影像处理领域对计算效率和精度有着近乎苛刻的要求,而ITK(InsightToolkit)正是在这样的需求背景下成长为行业标杆的开源工具包。当我们需要处理CT扫描的数百层切…...

阿尔兹海默症生物标志物研究进展及应用指南

一、引言阿尔兹海默症是一种以进行性认知功能障碍为主要特征的神经退行性疾病,其病理改变往往在临床症状出现前数年至数十年即已启动。早期诊断与干预对于延缓疾病进展、改善患者生活质量具有关键意义。生物标志物作为可客观测量与评估的生物学指标,在疾…...