小白零基础如何搭建CNN
1.面向对象编程
1.1类(Class)和对象(Object)

class Animal:"""定义一个动物类Animal,包含基本属性和行为。"""def __init__(self, name, species, age=0):"""__init__是类的初始化方法,用于创建类的对象时初始化书写初始化动物的属性。:param name: 动物的名字(字符串):param species: 动物的种类(字符串):param age: 动物的年龄(整数,默认为0)"""self.name = name # 动物的名字self.species = species # 动物的种类self.age = age # 动物的年龄def eat(self, food):"""对象方法描述动物进食的行为。:param food: 动物吃的食物(字符串)"""print(f"{self.name} 正在吃 {food}。")def sleep(self, hours):"""描述动物睡觉的行为。:param hours: 睡觉的小时数(整数)"""print(f"{self.name} 睡觉了 {hours} 小时。")def make_sound(self):"""描述动物发出声音的行为。"""print(f"{self.name} 发出了声音。")def display_info(self):"""打印动物的详细信息。"""print(f"名字: {self.name}")print(f"种类: {self.species}")print(f"年龄: {self.age} 岁")# 示例代码
if __name__ == "__main__":# 创建一个动物实例my_animal = Animal(name="小白", species="狗", age=3)# 调用方法my_animal.display_info() # 打印动物信息my_animal.eat("骨头") # 动物进食my_animal.sleep(8) # 动物睡觉my_animal.make_sound() # 动物发出声音
注:self 是一个特殊的参数,用于表示类的实例本身。它是一个指向当前对象的引用,允许你访问和修改对象的属性和方法。简单来说,self 就是“当前对象”的代名词。
1.卷积层
在PyTorch中针对卷积操作的对象和使用的场景不同,如有1维卷积、2维卷积、
3维卷积与转置卷积(可以简单理解为卷积操作的逆操作),但它们的使用方法比较相似,都可以从torch.nn模块中调用,需要调用的类如表2-4所示。
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')
参数说明
in_channels:输入数据的通道数。例如,对于 RGB 图像,in_channels=3。
out_channels:输出数据的通道数,即卷积核的数量。
kernel_size:卷积核的大小,可以是一个整数(表示正方形卷积核),也可以是一个元组(表示矩形卷积核)。例如,kernel_size=3 或 kernel_size=(3, 5)。
stride:卷积核移动的步长,默认为 1。可以是一个整数(表示水平和垂直方向的步长相同),也可以是一个元组(分别表示水平和垂直方向的步长)。
padding:输入数据的填充大小,默认为 0。可以是一个整数(表示水平和垂直方向的填充相同),也可以是一个元组(分别表示水平和垂直方向的填充)。填充的作用是增加输入数据的边界,使卷积操作后输出的尺寸更大或保持不变。
dilation:卷积核的扩张率,默认为 1。可以是一个整数(表示水平和垂直方向的扩张率相同),也可以是一个元组(分别表示水平和垂直方向的扩张率)。扩张率用于增加卷积核的感受野。
groups:分组卷积的组数,默认为 1。当 groups > 1 时,输入通道和输出通道会被分成若干组,每组分别进行卷积操作。
bias:是否为卷积层添加偏置项,默认为 True。
padding_mode:填充模式,默认为 ‘zeros’,表示用零填充。其他可选值包括 ‘reflect’ 和 ‘replicate’。

input:import torch
import torch.nn as nn# 创建一个 Conv2d 实例
conv_layer = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1)# 创建一个输入张量(模拟一个 3 通道的 28x28 图像)
input_tensor = torch.randn(1, 3, 28, 28) # (batch_size, channels, height, width)# 使用卷积层对输入张量进行卷积操作
output_tensor = conv_layer(input_tensor)print("输入张量的形状:", input_tensor.shape)
print("输出张量的形状:", output_tensor.shape)
output:输入张量的形状: torch.Size([1, 3, 28, 28])
1.1 填充层
填充(Padding) 是一种重要的操作,通常用于卷积层(Conv2d)和池化层(MaxPool2d、AvgPool2d 等)。填充的主要目的是在输入数据的边界上添加额外的值(通常是零),以控制卷积或池化操作后的输出尺寸在前面介绍的卷积操作中,可以发现经过卷积后,输出特征映射的尺寸会变小,卷积后的结果中损失了部分值,输入图像的边缘被“修剪”掉了,这是因为边缘上的像素永远不会位于卷积核中心,而卷积核也不能扩展到边缘区域以外。如果还希望输入和输出的大小应保持一致,需要在进行卷积操作前,对原矩阵进行边界填充(padding),也就是在矩阵的边界上填充一些值,以增加矩阵的大小。虽然卷积操作可以使用填充参数0进行边缘填充,但是在PyTorch中还提供了其他的填充函数,可以完成更复杂的填充任务,例如反射填充、复制填充等。针对不同的填充方式,下面使用2维矩阵的2D填充为例,展示了不同方法的填充效果,如图2-3所示


1.2 激活函数
。PyTorch提供了十几种激活函数层所对应的类,但常用的激活函数通常为S型
(Sigmoid)激活函数、双曲正切(Tanh)激活函数、线性修正单元(ReLU)激活函数等。常激活函数类和功能如表2-7所示。


1.3 归一化函数
归一化函数可以放置在卷积层和激活函数之间,也可以在激活函数之后。具体位置取决于所使用的归一化方法和网络架构的设计.常用的归一化函数层分别为批量归一化、组归一化、层归一化以及样本归一化。在图2-5中展示了各种归一化函数层的作用维度示意图,其中N表示数据中的batch(批量)维度,C表示channel(通道)维度,阴影部分表示要归一化为相同均值和方差的内容。



2.池化层
池化会选取一定大小区域,将该区域内的像素值使用一个代表元素表示。如果使用平均值代替,称为平均值池化,如果使用最大值代替则称为最大值池化。这两种池化方式的示意图如图2-2所示
在PyTorch中, 提 供 了 多 种 池 化 的 类, 分 别 是 最 大 值 池 化(MaxPool)、 最大 值 池 化 的 逆 过 程(MaxUnPool)、 平 均 值 池 化(AvgPool)与 自 适 应 池 化(AdaptiveMaxPool、AdaptiveAvgPool)等。并且均提供了1维、2维和3维的池化操作。具体的池化类和功能如表2-5所示。

input:#定义最大池化层
max_pool=nn.MaxPool2d(kernel_size=2,stride=2,padding=0)
#创建一个输入张量(模拟一个3通道的8*8图像)
input_tensor=torch.randn(1,3,8,8)#(batch_size,channels,height,width)
output_tensor=max_pool(input_tensor)
print("输入张量的形状:", input_tensor.shape)
print("输入张量的形状:", output_tensor.shape)
output:输入张量的形状: torch.Size([1, 3, 8, 8])
输入张量的形状: torch.Size([1, 3, 4, 4])

3.全连接层
它的作用是把输入的特征进行“混合”和“转换”,生成新的特征,最终用于分类或回归任务。
全连接层通常由两部分组成:
a.线性变换(nn.Linear):把输入特征转换成输出特征。
b.激活函数:在输出上应用非线性激活函数,比如 ReLU、Sigmoid 等,增加模型的非线性能力
torch.nn.Linear(in_features, out_features, bias=True)

input:#创建一个全连接层
fc_layer=nn.Linear(in_features=3,out_features=2,bias=True)
#创建一个输入张量(模拟一个人的身高、体重、年龄)
input_tensor=torch.tensor([[175.0,70.0,25.0]])
#应用全连接层
output_tensor=fc_layer(input_tensor)
import torch.nn.functional as F
#应用激活函数
activated_output=F.relu(output_tensor)
print("输入张量的形状:",input_tensor.shape)
print("输入张量的形状:",output_tensor.shape)
print("输入张量的形状:",activated_output)
output:输入张量的形状: torch.Size([1, 3])
输入张量的形状: torch.Size([1, 2])
输入张量的形状: tensor([[87.3310, 44.2483]], grad_fn=<ReluBackward0>)
相关文章:
小白零基础如何搭建CNN
1.面向对象编程 1.1类(Class)和对象(Object) class Animal:"""定义一个动物类Animal,包含基本属性和行为。"""def __init__(self, name, species, age0):"""__init__…...
在vivado中对数据进行延时,时序对齐问题上的理清
在verilog的ISP处理流程中,在完成第一个模块的过程中,我经常感到困惑,到底是延时了多少个时钟?今日对这几个进行分类理解。 目录 1.输入信号激励源描述 1.1将数据延时[9]个clk 1.2将vtdc与hzdc延时[9]个clk(等价于单bit的数据…...
《只狼》运行时提示“mfc140u.dll文件缺失”是什么原因?要怎么解决?
《只狼》运行时提示“mfc140u.dll文件缺失”是什么原因?要怎么解决? 宝子们,是不是在玩《只狼》的时候,突然弹出一个提示:“找不到mfc140u.dll文件”?这可真是让人着急上火!别慌,今…...
vue学习笔记7
打包发布 目标:明确打包的作用 说明:vue脚手架只是开发过程中,协助开发的工具,当真正开发完了 > 脚手架不参与上线 打包的作用: 将多个文件压缩合并成一个文件,语法降级,less sass ts 语法…...
Unity 增量打包AssetBundle
背景 打包太慢了,想要没改动的资源不重新打包浪费时间。 来源 官方文章:https://forum.unity.com/threads/about-incremental-build-and-asset-bundle-hashes.1436032/ 官网AB介绍:https://learn.unity.com/tutorial/assets-resources-and…...
嵌入式八股文面试题(二)C语言算法
相关概念请查看文章:C语言概念。 1. 如何实现一个简单的内存池? 简单实现: #include <stdio.h> #include <stdlib.h>//内存块 typedef struct MemoryBlock {void *data; // 内存块起始地址struct MemoryBlock *next; // 下一个内…...
尚硅谷爬虫note005
一、编解码 1.get请求的quote方法 将汉字转为Unicode字符 # _*_ coding : utf-8 _*_ # Time : 2025/2/12 16:33 # Author : 20250206-里奥 # File : demo19_get请求的quote方法 # Project : PythonProject10-14# 景甜page # https://www.baidu.com/s?ieutf-8&f8&rsv…...
xml 和json互转工具
工具1 有个问题会导致springboot返回捕获的异常编程xml格式 import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import org.json.JSONObject; import org.json.XML; import org.w3c.dom.Document;import javax.xm…...
ElementUI 抽屉组件高度封装
在前端开发中,ElementUI 的el-drawer组件虽实用,但为满足复杂业务需求,如统一样式、特定交互和灵活使用,常需二次封装。下面将带你实现一个高度封装的 ElementUI 抽屉组件。 创建基础封装组件 创建MyDrawer.vue,引入e…...
深入解析:如何在C#和C/C++之间安全高效地通过P/Invoke传递多维数组
在工业控制、机器人编程和物联网等领域,我们经常需要让C#这样的托管语言与C/C编写的底层库进行交互。在这个过程中,遇到需要传递多维数组的场景时,许多开发者会意外遭遇System.Runtime.InteropServices.MarshalDirectiveException异常。本文将…...
轻量级在线ETL数据集成工具架构设计与技术实现深度剖析
在当今数字化时代,企业面临着海量异构数据的整合挑战。ETL(Extract, Transform, Load)工具作为数据集成的核心,负责将分散在不同数据源中的数据进行抽取、转换和加载,以构建统一的数据视图。本文将深入剖析一款基于诺依框架开发的在线ETL数据集成工具,重点阐述其架构设计…...
二、k8s项目的生命周期
项目的生命周期 创建-----------》发布-----------》更新--------》回滚----------》删除 kubectl create deployment nginx1 --imagenginx:1.22 --replicas3 基于deployment控制器创建pod 控制器的名称是nginx1 pod使用的镜像:nginx:1.22 --replicas3 pod的数量有多少 3个…...
GPT 系列模型发展史:从 GPT 到 ChatGPT 的演进与技术细节
从 GPT 到 ChatGPT,OpenAI 用短短几年时间,彻底改变了自然语言处理(NLP)的格局。让我们一起回顾这段激动人心的技术演进史!🚀 🔹 GPT(2018): 划时代的起点&a…...
C#语言的云计算
C#语言在云计算中的应用 引言 随着信息技术的飞速发展,云计算已经成为了现代计算架构的重要组成部分。传统的本地计算方式逐渐被云计算所取代,使得企业与开发者能够更高效地处理数据、部署应用程序以及进行资源管理。在众多编程语言中,C#以…...
金仓数据库-KingbaseES-学习-01-单机部署(非图形化安装)
目录 一、环境信息 二、介绍 三、下载地址 四、安装步骤 1、配置内核参数 (1)文件系统相关 (2)共享内存与信号量(IPC) (3)网络与端口配置 (4)关键场…...
海外服务器都有什么作用?
海外服务器具体就是指部署在中国大陆以外地区的服务器,企业选择租用海外服务器能够显著提高不同国家和地区用户的访问速度,当网站的服务器部署在目标用户所在地附近时,数据信息所传输的距离就会缩短,大大降低了网络访问的延迟度&a…...
git bash在github的库中上传或更新本地文件
一、将本地文件上传到 GitHub 仓库 1. 创建 GitHub 仓库 如果你还没有在 GitHub 上创建仓库,首先需要创建一个新的仓库: 登录到 GitHub。点击右上角的 按钮,选择 New repository。给你的仓库起个名字,并选择 Public 或 Privat…...
vue2中 computed 计算属性
文章目录 vue2中 computed 计算属性1. 什么是计算属性?2. 基本用法1. 定义计算属性2. 计算属性的缓存特性 3. 计算属性的高级用法1. 计算属性的 Getter 和 Setter 方法2. 计算属性的依赖追踪 4. 计算属性与方法的区别5. 实际应用案例1. 格式化数据2. 计算总价3. 动态…...
自定义基座实时采集uniapp日志
自定义基座实时采集uniapp日志 打测试包给远端现场(测试/客户)实际测试时也能实时看到日志了,也有代码行数显示。 流程设计 #mermaid-svg-1I5W9r1DU4xUsaTF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid…...
基于YALMIP和cplex工具箱的微电网最优调度算法matlab仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 系统建模 4.2 YALMIP工具箱 4.3 CPLEX工具箱 5.完整工程文件 1.课题概述 基于YALMIP和cplex工具箱的微电网最优调度算法matlab仿真。通过YALMIP和cplex这两个工具箱,完成微电网的最优调…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
