深度学习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):将高层次的特征输出转换为最终的分类结果。每个神经元与前一层的所有神经元相连接。(将提取的高维特征映射到标签空间)
输出层:提供最终的预测结果,比如分类标签或回归值。
-
原理
卷积神经网络的核心原理是利用卷积操作进行特征提取。卷积层通过卷积核在输入图像上滑动,不断提取局部区域的特征,能够自动学习并优化这些特征。
卷积操作:通过卷积核与输入图像的局部区域进行点积,生成特征图。这个过程能够捕捉图像中的边缘、角点等基础特征。
参数共享:同一个卷积核在整个图像上重复使用,可以减少模型参数,提高模型的泛化能力。
局部感知:卷积核的大小限制了每个神经元的感知范围,使网络能学习到局部特征。 -
工作流程
卷积神经网络的工作流程通常包括以下几个步骤:
图像输入:将图像数据输入到网络中。
特征提取:
在卷积层中,通过多个卷积核对输入图像进行卷积,生成特征图。
通过激活函数引入非线性。
使用池化层进行特征降维。
分类阶段:
将经过多层特征提取后的特征图展平成一维向量,输入到全连接层。
使用激活函数进行处理。
损失计算:通过损失函数计算预测值与真实值之间的误差。
反向传播:通过反向传播算法更新网络中的权重和偏置,以最小化损失。
预测输出:经过最后的输出层,网络给出分类结果或回归输出。
例子,识别手写数字:
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 下输入安装命令࿰…...
微信小程序中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 到同簇内其他点的平均距离(簇内不相似度ÿ…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...