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

小白零基础如何搭建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’。
在这里插入图片描述

inputimport 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>)
http://www.lryc.cn/news/536534.html

相关文章:

  • 在vivado中对数据进行延时,时序对齐问题上的理清
  • 《只狼》运行时提示“mfc140u.dll文件缺失”是什么原因?要怎么解决?
  • vue学习笔记7
  • Unity 增量打包AssetBundle
  • 嵌入式八股文面试题(二)C语言算法
  • 尚硅谷爬虫note005
  • xml 和json互转工具
  • ElementUI 抽屉组件高度封装
  • 深入解析:如何在C#和C/C++之间安全高效地通过P/Invoke传递多维数组
  • 轻量级在线ETL数据集成工具架构设计与技术实现深度剖析
  • 二、k8s项目的生命周期
  • GPT 系列模型发展史:从 GPT 到 ChatGPT 的演进与技术细节
  • C#语言的云计算
  • 金仓数据库-KingbaseES-学习-01-单机部署(非图形化安装)
  • 海外服务器都有什么作用?
  • git bash在github的库中上传或更新本地文件
  • vue2中 computed 计算属性
  • 自定义基座实时采集uniapp日志
  • 基于YALMIP和cplex工具箱的微电网最优调度算法matlab仿真
  • Effective Objective-C 2.0 读书笔记——内存管理(上)
  • 蓝桥杯-洛谷刷题-day5(C++)(为未完成)
  • conda 修复 libstdc++.so.6: version `GLIBCXX_3.4.30‘ not found 简便方法
  • 数据结构之队列,哈希表
  • 讯方·智汇云校华为授权培训机构的介绍
  • 【16届蓝桥杯寒假刷题营】第1期DAY4
  • 【Linux】cron计划任务定时执行命令
  • rdian是一个结构体,pdian=^Rdian,list泛型做什么用?
  • 【05】RUST错误处理
  • WinForm 防破解、反编译设计文档
  • 1 推荐系统概述